SpringSecurity的总结
SprngSecurity就是一系列的过滤器封装,在对servlet进行请求前进行数据过滤,完成用户的认证授权操作,针对不同的路由可以使用不同的过滤器链进行过滤
。具体原理图如下:
springSecurity的位置,在过滤器中,通过代理了一个过滤器进行扩展
过滤器内部的结果
Security过滤器排序
以下是 Spring Security Filter 排序的完整列表:
- ForceEagerSessionCreationFilter
- 通道处理过滤器
- WebAsyncManagerIntegrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- 过滤器
CsrfFilter
- 注销过滤器
- OAuth2AuthorizationRequestRedirectFilter
- Saml2WebSsoAuthenticationRequestFilter
- X509AuthenticationFilter
- AbstractPreAuthenticatedProcessingFilter
- CasAuthenticationFilter
- OAuth2LoginAuthenticationFilter
- Saml2WebSsoAuthenticationFilter
UsernamePasswordAuthenticationFilter
- OpenIDAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- 并发会话过滤器
- DigestAuthenticationFilter
- BearerTokenAuthenticationFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- JaasApiIntegrationFilter
RememberMeAuthenticationFilter
- 匿名身份验证过滤器
- OAuth2AuthorizationCodeGrantFilter
- 会话管理过滤器
ExceptionTranslationFilter
FilterSecurityInterceptor
- 切换用户过滤器
Security提供的接口
UserDetailService接口
自定义用户名密码查询过程,返回Security自定义的User对象
PasswordEncoder接口
对返回的User对象的密码加密
LogoutHandler接口
处理注销操作的接口
Security的使用
认证
- 配置文件配置
- 实现UserDetailService接口,自定义用户名密码
配置文件进行配置
重写userDetailService接口,在里面可以自定义用户角色权限查询
更改配置文件,重新设置认证页面或者路径,配置需要认证的路径和不需要认证的路径
授权
授权就是在用户认证过后,对用户对应的角色或者权限,符合对应角色或者权限的路径可以访问
- 虽然分为用户的角色和权限,但是在用户处配置方式都是一样的,甚至角色权限混在一起的,所以权限和角色没有区别,有区别的话也就是角色的字段必须加
Role_关键字
通过用户的权限设置来授权路径访问
通过设置用户的角色来授权路径访问
授权异常跳转页面配置
通过注解简化授权配置
所以security的注解必须要全局开启先
@Secured
给@controller注解配置@Secured设置角色控制授权,注意是针对角色进行判断校验的,不是授权,授权是使用下面的两个注解
@PreAuthorize
访问连接之前判断是否有权限
@PostAuthorize
方法执行之后进行权限校验
@ PostFilter
权限验证之后对数据进行过滤
@PreFilter
对传入的数据进行过滤
Securiy其他功能
Security登录注销
配置注销的请求路径,和跳转页面
‘自定义注销handle完成自定义注销
Security自动登录
- security自动登录已经配置好了对应的数据库操作,也就是tokenrepository,我们只需要给他配置上数据源即可
- 在配置文件中配置自动登录的相关设置
CSRF
用户登录这个网站没有退出,登录信息仍然存在,这时候用户在一个新的页面打开其他网站,其他网站伪造好了对这个网站的put操作,但是你不知道只是点击了一下,然后就可以用这个请求成功发送数据。
解决办法:每次请求都要进行用户身份验证,这个前提是网站自身的cookie是绝对安全的,其他人无法访问。
SpringSecurity定义多个过滤器链
可以定义多个过滤器链完成不同路径请求的处理,适合处理登陆和后期token验证的任务
SpringCloudSecurity可以搭建Oauth2认证服务器
推荐链接
OAuth2.0协议包含的角色
- 资源所有者(Resource Owner):
能够授予对受保护资源的访问权限的实体。通常是用户(user),也可以是应用程序,即该资源的拥有者。 - 认证服务器(Authorization server):
又称为授权服务器,认证成功后会给客户端发放令牌(),作为客户端访问资源服务器的凭据。
服务器认证成功后向客户端颁发访问令牌(access_token),作为客户端访问资源服务器的凭据,并验证资源所有者并获得授权。
简单点说就是登录功能,用于服务提供者对资源拥有的身份进行认证,对访问资源进行授权。 - 资源服务器(Resource server)
托管受保护资源的服务器,能够接受并使用访问令牌响应受保护的资源请求。 - 第三方应用程序(Third-party application): - 示例中的浏览器、微信客户端
又称为客户端(client),本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源。
四种授权模式(authorization grant):
- Authorization code Grant:授权码模式,推荐使用
- Implicit Grant:隐藏/简化模式,不推荐使用
- Resource Owner Password Credentials Grant:密码模式
- Client Credentials Grant:客户端模式