首页 > 技术文章 > spring security学习----配置适配器 WebSecurityConfigurerAdapter

aismvy 2020-05-12 17:58 原文

  1 /**
  2  *  spring security 核心配置文件
  3  */
  4 @Configuration
  5 public class BrowerSecurityConfig extends WebSecurityConfigurerAdapter {
  6     @Autowired
  7     private AuthenticationManager authenticationManager;
  8     @Autowired  //自定义的安全元   数据源     实现FilterInvocationSecurityMetadataSource
  9     private MyInvocationSecurityMetadataSourceService myInvocationSecurityMetadataSourceService;
 10     @Autowired //自定义访问决策器
 11     private MyAccessDecisionManager myAccessDecisionManager;
 12 
 13     @Override
 14     protected void configure(HttpSecurity http) throws Exception {
 15         /**
 16          *  from表单登录设置
 17          */
 18         http.formLogin()
 19                 .loginPage("")                      //登录页面                      /login
 20                 .passwordParameter("")              //设置form表单中对应的name参数  默认为 password   下同
 21                 .usernameParameter("")              //
 22                 .defaultSuccessUrl("")            //认证成功后的跳转页面 默认跳转页面   可以设置是否总是默认  不是的话可以跳转与用户的target-url
 23                 .failureUrl("")
 24                 .failureForwardUrl("")            //登录失败 转发 的url
 25                 .successForwardUrl("")              //登录成功 转发 的url  与successHandler对应  即处理完后请求转发的url
 26                 .failureHandler(null)               //自定义的认证失败 做什么处理
 27                 .successHandler(null)               //自定义认证成功 后做的处理    ----- 例如 想记录用户信息判断用户状态等
 28                 .permitAll()                      //对于需要所有用户都可以访问的界面 或者url进行设置
 29                 .loginProcessingUrl("")             //自定义处理认证的url    默认为    /login
 30                 .authenticationDetailsSource(null)  //自定义身份验证的数据源  理解为查出数据库中的密码 和权限(可以不加) 然后再交给security
 31                 ////修改和替换配置     已经配置好的修改   例如下面修改  安全拦截器的安全数据源
 32                 .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
 33                     public <O extends FilterSecurityInterceptor> O postProcess(
 34                             O fsi) {
 35                         fsi.setPublishAuthorizationSuccess(true);
 36                         //修改成自定义的     安全元数据源  权限的源  !!!!!
 37                         fsi.setSecurityMetadataSource(myInvocationSecurityMetadataSourceService);
 38                         //修改成自定义的     访问决策器  自定义的
 39                         fsi.setAccessDecisionManager(myAccessDecisionManager);
 40                         //使用系统的
 41                         fsi.setAuthenticationManager(authenticationManager);
 42                         return fsi;
 43                     }
 44                 });
 45         /**
 46          *  请求认证管理
 47          */
 48         http.authorizeRequests()
 49                 .antMatchers("url匹配路径").permitAll()          //url匹配路径 permitAll 运行 全部访问 不用认证
 50                 .accessDecisionManager(null)                                 //访问决策器
 51                 .filterSecurityInterceptorOncePerRequest(true)               //过滤每个请求一次的安全拦截器 ???
 52                 .anyRequest().authenticated()                                //其他的请求 需要认证,
 53                 .antMatchers("/admin/**").hasRole("ADMIN")      //url匹配路径  具有怎样的角色
 54                 .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")   //url匹配路径    具有怎样的角色 或者是权限
 55         ;
 56         /**
 57          *  anonymous
 58          *
 59          *  匿名访问时  存在默认 用户名  annonymousUser
 60          */
 61         http.anonymous().disable().csrf().disable();                         //禁止匿名  关闭csrf
 62         /**
 63          * 登出操作管理
 64          */
 65         http.logout()                                                        //登出处理
 66                 .logoutUrl("/my/logout")
 67                 .logoutSuccessUrl("/my/index")
 68                 .logoutSuccessHandler(null)
 69                 .invalidateHttpSession(true)
 70                 .addLogoutHandler(null)
 71                 .deleteCookies("cookieNamesToClear")
 72         ;
 73         /**
 74          *  session  会话管理
 75          */
 76         http.sessionManagement()                                            //session管理
 77                 .maximumSessions(2)                                         //最大session 数量 --用户
 78                 .maxSessionsPreventsLogin(false)                            //超过最大sessin数量后时候阻止登录
 79                 .expiredUrl("/")                                            //会话失效后跳转的url
 80                 .expiredSessionStrategy(null)                               //自定义session 过期错略
 81                 .sessionRegistry(null)                                     //自定义的session 注册 表
 82         ;
 83 
 84     }
 85 
 86     @Override
 87     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 88         /**
 89          *   基础的配置
 90          */
 91         auth
 92                 /**
 93                  * 认证 时触发的事件
 94                  */
 95                 .authenticationEventPublisher(null)
 96                 /**
 97                  *  用户细节服务
 98                  *
 99                  *  认证管理器数据的来源 吧  用户身份凭证信息和 权限信息
100                  */
101                 .userDetailsService(null)
102                 /**
103                  *  密码编辑器 对密码进行加密
104                  */
105                 .passwordEncoder(null)
106         ;
107     }
108 
109     @Bean
110     @Override
111     public AuthenticationManager authenticationManagerBean() throws Exception {
112         return super.authenticationManagerBean();
113     }
114 
115     @Override
116     public void configure(WebSecurity web) throws Exception {
117         /**
118          * 不进行拦截的mvc
119          */
120         web.ignoring().mvcMatchers();
121         /**
122          * 添加自定义的 安全过滤器
123          */
124         web.addSecurityFilterChainBuilder(null);
125     }
126 }

 

推荐阅读