springsecurity-shiro获取登录用户
解析主流的安全框架校验以及获取登录用户流程。
SpringSecurity
SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。
spring-security获取当前登录用户信息:
(LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal()
解析该代码如何能够获取登录用户。
-
SecurityContextHolder
SpringSecurity的基本组件,用来存放SecurityContext的对象。默认使用ThreadLocal实现,保证了本线程内所有的方法都可以获得SecurityContext对象。
-
Authentication
Authentication是springsecurity中保存用户信息的对象,里面包含用户信息,权限信息,登录密码等。可以通过SecurityContextHolder来获取Authentication对象,然后再获取用户信息。
关键请求流程如下:
关键过滤器:
/**
* token过滤器 验证token有效性
*
* @author ruoyi
*/
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
{
@Autowired
private TokenService tokenService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException
{
LoginUser loginUser = tokenService.getLoginUser(request);
if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
{
tokenService.verifyToken(loginUser);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
chain.doFilter(request, response);
}
}
shiro
shiro获取当前登录用户信息:
(LoginUser) SecurityUtils.getSubject().getPrincipal();
包含三大组件:
- Subject:当前跟软件交互的用户,第三方进程,后台账户等
- SecurityManager:核心。进行管理内部组件实例,并通过它来提供安全管理的各种服务
- Realms:Shiro与应用安全数据间的“桥梁”或者“连接器”,会从应用配置的Realm中查找用户及其权限信息。
校验思路与springsecurity类似,同样也是使用过滤器进行用户校验从而获取实际请求的用户信息。
@Slf4j
public class MyShiroRealm extends AuthorizingRealm {
/**
* 授权
*
* @param principals
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
if (principals == null) {
log.error("MyShiroRealm[] doGetAuthorizationInfo[] principals should not be null");
throw new AuthorizationException("principals should not be null");
}
// ...
}
/**
* 认证
*
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//获取用户的输入的账号.
String userAccount = (String) token.getPrincipal();
LoginUser user = userService.queryUserInformation(userAccount);
if (user == null) {
throw new UnknownAccountException();
}
// ...
}
}
总结
SpringSecurity与Shiro实现原理类似。Shiro更轻量,SpringSecurity与Spring结合度更高也更复杂。
参考资料:
- 安全认证之SecurityContextHolder
- SpringSecurity登录用户数据获取
- Spring Security 详解
- Shiro - Shiro简介;Shiro与Spring Security区别;Spring Boot集成Shiro
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfkjaee
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13