文章目录
安全框架:spring security、jwt、OAuth、shiro、cas
核心概念:Authentication登录、Authorization授权;filter过滤实现。
Spring Security
官网文档:https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/
@EnableGlobalMethodSecurity,开启方法级安全
spring security默认:user、随机密码;配置:spring.security.user.name/password
Spring Security架构
http://www.spring4all.com/article/433
Authentication认证(身份验证)、Authorization授权(访问控制)。
Design to seperate authentication from authorization。
过滤器实现:UsernamePasswordAuthenticationFilter、AnonymousAuthenticationFilter、ExceptionTranslationFilter、FilterSecurityInterceptor
Authentication
核心:AuthenticatonManager/ProviderManager、AuthenticationProvider、Authentication
定制:继承WebSecurityConfigurerAdapter,重写configure(),通过AuthenticationManagerBuilder定制local AuthenticationManager。
UserDetailsService,解耦认证与用户信息获取。
Authorization
核心:AccessDecisionManager、AccessDecisionVoter
SecurityContext
核心:SecurityContextHolder、SecurityContext
安全内容,绑定到线程。
FilterChain
责任链模式;FilterChain–DelegatingFilterProxy/FilterChainProxy/FilterChain、Filter
SecurityContextPersistenceFilter;
UsernamePasswordAuthenticationFilter;身份验证
AnonymousAuthenticationFilter;
ExceptionTranslationFilter;
FilterSecurityInterceptor;访问控制
tomcat FilterChain:ApplicationFilterChain,包含Filter(Filter、DelegatingFilterProxy)
DelegatingFilterProxy持有FilterChainProxy,FilterChainProxy持有多个FilterChain;通过url匹配,返回适合的FilterChain,最终逐一执行。
DelegatingFilterProxy模式,关联web.xml配置、spring bean。
HttpSecurity@addFilterAt();不覆盖原filter,并行判定
权限
https://docs.spring.io/spring-security/site/docs/5.1.6.RELEASE/reference/htmlsingle/#el-access
https://www.cnblogs.com/jaylon/p/4905769.html
注解
- @Secured;securedEnabled,@Secured(“ROLE_ADMIN”)
- @RoleAllow;jsr250Enabled,@RoleAllow(“ROLE_ADMIN”)
- @PreAuthorize;prePostEnabled,可使用spEL表达式。
- @PostAuthorize;
- @PreFilter;
- @PostFilter;
表达式
- authentication、principal;
- #varName,引用方法变量
- permitAll、denyAll;true、false
- hasRole、hasAnyRole;角色
- hasAuthority、hasAnyAuthority;权限
- hasIpAddress(IP Adress);用户地址
- isAnonymous();是否为匿名用户
- isAuthenticated();不是匿名用户
- isFullyAuthenticated();不是匿名也不是remember-me认证
- isRemberMe();remember-me认证
permission权限
需自己实现PermissionEvaluator;
继承GlobalMethodSecurityConfiguration,重写createExpressionHandler;设置DefaultMethodSecurityExpressionHandler的处理类为自己实现的PermissionEvaluator
SpringBoot整合
导包:spring-boot-starter-security
配置:WebSecurityConfigurerAdapter配置安全策略,@EnableWebSecurity开启;UserDetailsService/UserDetails,用户获取
登录:HttpSecurity配置。
权限:配置安全策略时添加权限。
- @EnableGlobalMethodSecurity,通过其属性开启权限注解
- @PreAuthorize,权限注解,prePostEnabled=true开启;角色名ROLE_开头。
- https://blog.csdn.net/l18767118724/article/details/72934564
密码加密:NoOpPasswordEncoder.newInstance(),无加密
- 其他PasswordEncoder实例,加密。
获取用户:SecurityContextHolder/SecurityContext
操作权限:菜单判定
jwt登录;https://www.jianshu.com/p/d5ce890c67f7
https://blog.csdn.net/gaoleijie/article/details/82659168
- 继承AbstractAuthenticationProcessingFilter,拦截请求,构建token,提交验证;
- 配置AuthenticationManager,WebSecurityConfigurerAdapter#authenticationManager()
- 配置登录后成功、失败的handler
注意
1,HttpSecurity#loginPage();指定自定义登录页面路径,页面需自己写
2,AuthenticationManagerBuilder#passwordEncoder();指定密码加密策略,保存时需encode()加密保存
Spring Security OAuth2
验证过程类似cas。
概念:客户端、资源服务器、授权服务器、用户/浏览器
模式:
- 授权码模式;授权码浏览器中转、token浏览器不可见
- 简化模式;给token
- 密码模式;用户名、密码给client
- 客户端模式;client视作用户,通过clientId,secret登录
步骤:配置资源服务器、配置授权服务器、配置spring security
Spring for All整理
http://www.spring4all.com/article/449
OAuth 客户端模式原理
/oauth/token,获取令牌
用户验证,客户端验证;验证逻辑与spring security相似。
ClientCredentialsTokenEndpointFilter;构建待验证authentication。
AuthenticationManager;验证;UserDetailsService、ClientDetailsUserDetailsService;获取信息。PasswordEncoder密码加密策略
TokenEndpoint;构建TokenRequerst,交由TokenGranter构建token。principal由AuthenticationManager载入。
TokenGranter;授权模式,构建token
- ResourceOwnerPasswordTokenGranter => password密码模式
- AuthorizationCodeTokenGranter => authorization_code授权码模式
- ClientCredentialsTokenGranter => client_credentials客户端模式
- ImplicitTokenGranter => implicit简化模式
- RefreshTokenGranter =>refresh_token 刷新token专用
安全策略配置
ResourceServerConfigurerAdapter#configure();配置访问权限
oauth资源服务器中配置拦截范围,防止与spring security冲突,http.requestMartchers().antMartchers(…)。
springBoot1.3~1.5,添加配置security.oauth2.resource.filter-order=3。
JWT(Json Web Token)
加密信息的交互;介绍:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
三部分:header、payload、signature。
导包:com.auth0#java-jwt
spring security、jwt权限写入
//构建权限;princ为用户,credi为密码,auths为权限
Authentication auth = new UsernamePasswordAuthenticationToken(princ,credi,auths);
//写入权限;清除权限
SecurityContextHolder.getContext().setAuthentication(auth);
SecurityContextHolder.getContext().setAuthentication(null);
加密解密类
单向加密
信息摘要,无法解密
MD5
BCryptPasswordEncoder;只能加密,无法解密。
- PasswordEncoder pe = new BCryptPasswordEncoder();
- PasswordEncoder#encode();加密
- PasswordEncoder#matches();匹配
双向加密
Base64工具类
Rsa