这篇文章介绍下security在spring-boot中如何进行集成配置。
之前在学习Spring-security的时候还是使用传统的xml进行配置。基本上需要单独建一个xml文件来配置security,内容很多,也有小伙伴给我反馈说太复杂了。一头晕啊。
下面就来看看spring-boot下如何把复杂的配置简单化。
由于官网的文档讲述的是各个组件是如何使用的,每个组件讲的非常细致,但是对于快速学习来说不是很容易,所以这里我就介绍下在开发中如何来学习官网文档。
本示例代码版本为:
spring-boot:1.5.8.RELEASE
spring-security:4.2.3.RELEASE
源代码地址: TM-security-demo
org.springframework.boot
spring-boot-starter-security
现在已经有了框架了,剩下的就是实现权限管理了。
到这里我们关心的就是如何在登录的时候做权限控制。开始准备
建立登录页面
创建Controller来提供几个服务
准备工作完成,现在要实现的就是对这几个服务做控制,
比如:
a>以/user/开头的服务需要登录才能授权访问,未授权需要到登录页面,
b>其他服务可以不授权直接访问。
c>如果登录失败跳转到login-error控制器
// url权限
http.authorizeRequests().antMatchers("/", "/index").permitAll().antMatchers("/css/*", "/css/*").permitAll()
.antMatchers("/index", "/index").permitAll().anyRequest().authenticated();
// 表单登录
http.formLogin().loginPage("/login").defaultSuccessUrl("/login/success").failureUrl("/login-error").permitAll();
// 登出
http.logout().logoutSuccessUrl("/index").permitAll();
权限拦截已经配置好了,下面就是切人到如何做用户名和密码的认证了。
建立一个UserDetailsService,来查询数据库填充UserDetails信息
将自定义的 UserDetailsService 注入到认证管理器中。这里也简单实现了下自定义密码加密操作的实现。
启动程序跑跑看,现在已经实现了上述的要求。现在再来看下代码,简直太爽了,有没有相见恨晚的感觉呢。
其实到这里已经完成了项目中的小小要求了。后续的其他章节描述只是在我们项目中遇到了才会一个一个慢慢来配置的。比如使用openId来替代jdbc的认证。需要自定义filter等等一些常见需求都可以在文档中找到答案。
所以快速入门的话,掌握以上内容就可以体验下sprint-boot下security的鉴权。不过要想明白security能完成那些功能还是需要将文档通篇读一遍。
在这里就简单的介绍一下其他的常用配置。
// 在security过滤器之前走自己的过滤器
http.addFilterBefore(new TmBeforeSecurityFilter(), ChannelProcessingFilter.class);
http.addFilterAfter(new TmAfterSecurityFilter(), SwitchUserFilter.class);
// session管理策略(Stateless RESTful)
// http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// sessionManagement可以设置并发等其他的session策略
// http.sessionManagement().sessionAuthenticationStrategy(new
// ConcurrentSessionControlAuthenticationStrategy(new
// 禁用CSRF(跨站请求伪造)
http.csrf().disable();
// CORS(跨站资源共享)
http.cors();
// 跨域请求
http.headers().frameOptions().sameOrigin();
// 如果登录不允许跨越访问
// http.headers().frameOptions().sameOrigin().addHeaderWriter(new
// DelegatingRequestMatcherHeaderWriter(
// new AntPathRequestMatcher("/login"), new XFrameOptionsHeaderWriter()));
// HSTS
// http.headers().httpStrictTransportSecurity().disable();
// X-XSS保护
// http.headers().xssProtection().block(false);
// 静态头
http.headers().addHeaderWriter(new StaticHeadersWriter("X-Custom-Security-Header", "majj"));
// 设置静态资源的缓存时间
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
在学习security的时候需要了解一些常用的类及关系图,以及过滤器在过滤器按照它们在过滤器链中出现的顺序。
总结
只是总结一下,到目前为止我们看到的Spring Security的主要组成部分是:
SecurityContextHolder,提供访问SecurityContext。
SecurityContext,以容纳Authentication和可能的请求特定的安全信息。
Authentication以Spring Security的具体方式来代表委托人。
GrantedAuthority,以反映授予委托人的应用程序范围的权限。
UserDetails,以提供从应用程序的DAO或其他安全数据源构建Authentication对象所需的信息。
UserDetailsService,以UserDetails在String基于用户名(或证书ID等)中传递时创建。
Authentication 认证
AuthenticationManager 认证管理器
ProviderManager 认证提供者管理器
AuthenticationProvider 认证提供者
GrantedAuthority 授权
AccessDecisionManager 授权决策
AccessDecisionVoter 授权选举投票
DelegatingFilterProxy 过滤器链