spring安全_笔记


安全框架: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值