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 }