Spring Securityはキャラクター継承を実現します.

3473 ワード

Spring Securityはキャラクター継承を実現します.
本論文では、Spring Securityに基づいて、キャラクターの継承がどのように行われるかを説明します.
パーミッション宣言
多くのアプリケーションはSpring Securityに基づいて認証プロセスを実現するために、通常はいくつかのキャラクターを定義する必要があります.これらのキャラクターは優先度や階層関係があるかもしれません.仮に私たちは三つのキャラクターがあるとします.ADMIN、MODERATOR、USER.
以下のコードは権限声明を行います.
@Secured(['MODERATOR'])
def dashBoard(){
    render(view: 'dashBoard')
}
私たちは注釈でキャラクターの訪問を制限しているのを見ました.ADMINユーザーにも訪問したいなら、キャラクター声明を追加する必要があります.
@Secured(['ADMIN','MODERATOR'])
これは需要を実現することができますが、私たちのシステムにはこのような場面が多いので、このような方式を採用するのはくどいです.
キャラクター継承を実現
キャラクター継承を実現するには、次の2つのステップが必要です.
  • 定義bean RoleHerchy
  • 定義expressitionhandlerリーダーシップ
  • 例示的な構成コード:
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.access.expression.SecurityExpressionHandler;
    import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
    import org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.web.FilterInvocation;
    import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
    
    @EnableWebSecurity
    public class SpringSecurityConfigurer extends WebSecurityConfigurerAdapter{
    
        private SecurityExpressionHandler webExpressionHandler() {
            DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
            defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
            return defaultWebSecurityExpressionHandler;
        }
    
        @Bean
        public RoleHierarchy roleHierarchy(){
            RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
            roleHierarchy.setHierarchy("ADMIN > MODERATOR > USER");
            return roleHierarchy;
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .withUser("ekansh")
                    .password("password")
                    .authorities("USER", "ROLE");
            auth.inMemoryAuthentication()
                    .withUser("admin")
                    .password("admin")
                    .authorities("ADMIN");
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .expressionHandler(webExpressionHandler())
                    .antMatchers("/admin/**").hasAuthority("ADMIN")
                    .antMatchers("/user/**").hasAuthority("USER")
                    .anyRequest().authenticated()
                .and()
                .formLogin()
                .and()
                .logout()
            ;
        }
        
    }
    
    上記の例では、キャラクターの継承関係は以下の通りです.
  • ADMINはMODERATORとUSERのキャラクター権限にアクセスできます.
  • MODERATORはUSERキャラクターにアクセスできます.
  • USER及びMODERATORキャラクターにアクセスできなく、ADMINキャラクター権限にもアクセスできません.
    締め括りをつける
    キャラクターの継承により、キャラクターとキャラクターの権限の設定と管理がより簡単になります.