吐槽Spring Security
刚开始使用的时候确实很简单,只需要添加依赖和几个配置类就行,但到后面只是想OAuth2和Spring Security默认登录功能一起用的时候,发现无从下手。看来不对Spring Security有个大概的了解,那么灵活是不存在的。
最简的配置
修改pom.xml
1 | xml复制代码<!-- 若使用Spring Security则需要配置该依赖 --> |
新增Spring Security配置类
1 | scala复制代码@EnableWebSecurity |
新增OAuth2配置类(注意Spring Security过滤器会因为@Order顺序而在执行的时候有先后顺序,默认情况下过滤器执行顺序是OAuth2 Authorization -> OAuth2 Resource -> Spring Security)
1 | java复制代码@EnableAuthorizationServer |
1 | scala复制代码@EnableResourceServer |
通过Spring Security自带的登录页面登录http://127.0.0.1:8080/login
通过OAuth2获取token http://127.0.0.1:8080/oauth/token?username=user1&password=123456&grant_type=password&client_id=client1&client_secret=123456
通过获取的token访问资源
介绍Spring Security原理
通过DelegatingFilterProxy、FilterChainProxy、SecurityFilterChain实现认证和授权,需要特别注意的是1.一次请求里只有最先匹配到的SecurityFilterChain会被执行。2.SecurityFilterChain里有一系列跟认证/授权相关的过滤器,其中包括FilterSecurityInterceptor。
Spring Security主要组成部分
SecurityContextHolder
, 提供获取SecurityContext
的方法。SecurityContext
, 安全上下文,提供获取Authentication
等方法。Authentication
, 代表认证的对象。GrantedAuthority
, 代表赋予的权限。
SecurityContextHolder,可以获取安全上下文SecurityContext。
1 | ini复制代码// 代码来自https://www.springcloud.cc/spring-security-zhcn.html |
UserDetailsService用于根据用户名加载用户信息。
1 | java复制代码public interface UserDetailsService { |
AuthenticationManager是认证管理器,其实现类ProviderManager通过一系列AuthenticationProvider实现类验证认证信息。
1 | java复制代码public interface AuthenticationManager { |
AccessDecisionManager是访问决策管理器,可以通过该类实现动态权限控制。其实现类AffirmativeBased通过一系列AccessDecisionVoter实现类决定授权结果。
1 | java复制代码public interface AccessDecisionManager { |
以下是阅读过的其他作者写的文章
- Spring Security中文参考手册 www.springcloud.cc/spring-secu…
- blog.csdn.net/weixin_4387…
本文转载自: 掘金