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 }