SecurityAauth2安全认证
oauth2.0配置
配置token保存dataSource
配置客户端登录成功监听器
认证流程
首先走-AbstractAuthenticationProcessingFilter-抽象父类(认证处理过滤器),处理是否请求包含(client_id)字段,如果有,就走oauth2.0认证过滤器(进行认证),没有就执行下一个其他过滤器
ClientCredentialsTokenEndpointFilter-为oauth2.0继承继承过滤器实现认证流程。把请求参数取出来,构成oauth2.0认证对象,交给 AuthenticationManager (认证管理器进行认证,里面有认证提供商(AuthenticationProvider)、就是处理 oauth2.0认证的、和查数据库操作等)
AuthenticationManager (获取所有的认证服务提供商,并循环处理需要认证的数据)。首先交给(AbstractUserDetailsAuthenticationProvider)抽象父类认证服务提供商进行处理,oauth2.0默认的认证服务为-DaoAuthenticationProvider(根据client_id,从数据库查询客户端是否存在、进行密码判断等)
密码判断了成功,那么过滤器(AbstractAuthenticationProcessingFilter)处理完成,进行登录成功处理,通过请求
接下来进入-(TokenEndpoint)类(
@RequestMapping(value = "/oauth/token"))地址,进行用户登陆处理
创建token进入(tokenRequest)、根据客户端登录(password),进入(ResourceOwnerPasswordTokenGranter)密码token创建器,首先执行父类(AbstractTokenGranter)的(getAccessToken)方法获取token信息,再调用(getOAuth2Authentication)方法(可以不同的子类继承)进行用户登录验证,这里调用(ResourceOwnerPasswordTokenGranter)类里面的(getOAuth2Authentication)
ResourceOwnerPasswordTokenGranter类,获取当前客户端登录验证的用户进行登录,进行调用(WebSecurityConfigurerAdapter-authenticate)配置类中方法进行验证用户。(WebSecurityConfigurerAdapter)里面有 认证管理器(ProviderManager),然后调用管理器当中的认证服务器提供商(DaoAuthenticationProvider)进行用户查询,调用(UserDetailsService(用户详情服务)的 (loadUserByUsername (根据用户名称加载登录用户))),返回登录的人员信息,在此处加载人员权限等
默认token服务(DefaultTokenServices),根据登录的用户进行token创建。首先根据(JdbcTokenStore)token管理器,根据授权id查询已经授权的token信息,过期就移除重新创建刷新token,再根据storeAccessToken,创建新的token并保存
token返回对象(OAuth2AccessToken)优化进行返回
spring-security配置
配置静态资源文件路径
配置允许访问路径、登录成功处理,登录失败处理
怎么实现登录认证的
- 登录认证请求地址 ->/oauth/token
响应的SecurityAauth安全认证实现类: /oauth/token - 项目2
- 项目3
关于请求头的设置
- SecurityAauth安全认证必须设置的请求头Authorization请求头,作为设置的token信息
- SecurityAauth安全认证设置的token前面需要加一个Bearer+空格 + token只有这样SecurityAauth安全认证才能解析出来正确的token信息
注意这些请求头的设置都是通过SecurityAauth的拦截器:OAuth2AuthenticationProcessingFilter去进行拦截获取token信息的
备注:安全拦截截图
备注:请求头设置的截图
请求示例:
重要
1、在使用 JdbcTokenStore 类作为token存储的时候
2、在请求头加上了token之后会取出token,然后把 token 进行md5 运算,在进行数据库 token_id 查找
3、存储时也是把生成的 token 进行 MD5运算,保存到 token_id
//获取
private static final String DEFAULT_ACCESS_TOKEN_INSERT_STATEMENT = "insert into oauth_access_token (token_id, token, authentication_id, user_name, client_id, authentication, refresh_token) values (?, ?, ?, ?, ?, ?, ?)";
private static final String DEFAULT_ACCESS_TOKEN_SELECT_STATEMENT = "select token_id, token from oauth_access_token where token_id = ?";
//获取
private static final String DEFAULT_ACCESS_TOKEN_AUTHENTICATION_SELECT_STATEMENT = "select token_id, authentication from oauth_access_token where token_id = ?";
// 插入
private static final String DEFAULT_ACCESS_TOKEN_INSERT_STATEMENT = "insert into oauth_access_token (token_id, token, authentication_id, user_name, client_id, authentication, refresh_token) values (?, ?, ?, ?, ?, ?, ?)";
社交登录流程
微博登录
- 浏览器,用户点击微博登录图标(需要开发者到微博注册 client_id)
- 跳转到微博登录授权页面,跳转的时候需要带上client_id,以及登录成功的重定向地址:redirect_url
- 用户输入微博的用户名、密码进行登录
- 登录成功之后,根据重定向地址redirect_url进行返回,并携带 code,作为登录凭证
- 重定向地址为开发者的地址,解析得到的 code
- 根据code调用微博获取access_token的URL地址。调用的时候需要携带 凭证 code、注册 client_id、注册 的 秘钥key,重定向地址。
- 根据上一步可以得到access_token,然后通过access_token调用提供的一些基本的用户在微博上面的基础信息