今天更新文章的原因是粉丝提了个问题: 如何实现Oauth2认证服务器自定义登录接口以及返回自定义格式? 这里我给大家分享一个简单且实用的方法,既可以灵活定制登录参数也可以自行组装返回结果。
我们知道,认证服务器生成token的入口是 TokenEndpoint#postAccessToken(Principal principal, @RequestParam Map<String, String> parameters) ,那我们就可以直接在认证服务器自定义一个登录接口,然后组装好 TokenEndpoint#postAccessToken() 需要的参数,直接调用它生成token后再封装成我们需要的格式即可。
接下来我们直接进入实战:
为了兼容密码模式和自定义的短信验证码模式,我们将所有的参数都放入一个实体,大家可以根据自己的项目需要自行封装。
这里我们将 TokenEndpoint 注入,然后伪装一个客户端的认证流程,调用 TokenEndpoint.postAccessToken() 获取接口。
这里我们写死了client信息,实际上也可以通过Header请求头传入或者通过配置文件注入。
这个安全配置类中有两个放行策略,一个通过 permitAll() 实现,一个通过 web.ignoring() 实现,他们两个的区别是:
web ignoring() 比较适合配置前端相关的静态资源,它是完全绕过spring security得所有filter的; permitAll() ,会给没有登录的用户适配一个AnonymousAuthenticationToken,设置到SecurityContextHolder,方便后面的filter可以统一处理authentication。
本文提供的方案是将登录接口与认证服务器放在一起,如果在项目中由于某些原因不方便将其放在认证服务中,也可以让认证服务器提供一个Feign接口,然后让后端服务调用此接口进行登录即可。
来源:公众号——JAVA日知录
评论留言