文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

shiro拦截认证的过程是什么

2023-06-21 21:54

关注

这篇文章主要介绍“shiro拦截认证的过程是什么”,在日常操作中,相信很多人在shiro拦截认证的过程是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”shiro拦截认证的过程是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

概述

Shiro是apache旗下一个开源安全框架(http://shiro.apache.org/),它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。

Shiro框架三大核心对象

shiro拦截认证的过程是什么

说明:

1)Subject :主体对象,负责提交用户认证和授权信息。

2)SecurityManager:安全管理器,负责认证,授权等业务实现。(核心)

3)Realm:领域对象,负责从数据层获取业务数据。

shrio 拦截认证全过程

 1.FilterRegistrationBean过滤注册bean

@Beanpublic FilterRegistrationBean shiroFilterRegistration() {    FilterRegistrationBean registration = new FilterRegistrationBean();    registration.setFilter(new DelegatingFilterProxy("shiroFilter"));    //该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理    registration.addInitParameter("targetFilterLifecycle", "true");    registration.setEnabled(true);    registration.setOrder(Integer.MAX_VALUE - 1);    registration.addUrlPatterns("@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {    //获取请求token,如果token不存在,直接返回401    String token = getRequestToken((HttpServletRequest) request);    if(StringUtils.isBlank(token)){        HttpServletResponse httpResponse = (HttpServletResponse) response;        httpResponse.setContentType("application/json;charset=utf-8");        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");        httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());        String json = new Gson().toJson(new Result().error(ErrorCode.UNAUTHORIZED));        httpResponse.getWriter().print(json);        return false;    }    return executeLogin(request, response);}

调用父类 executeLogin 进行登录验证

protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {    AuthenticationToken token = this.createToken(request, response);    if (token == null) {        String msg = "createToken method implementation returned null. A valid non-null AuthenticationToken must be created in order to execute a login attempt.";        throw new IllegalStateException(msg);    } else {        try {            Subject subject = this.getSubject(request, response);            subject.login(token);            return this.onLoginSuccess(token, subject, request, response);        } catch (AuthenticationException var5) {            return this.onLoginFailure(token, var5, request, response);        }    }}

subject.login(token); 进行登录

login方法被DelegatingSubject重写

public void login(AuthenticationToken token) throws AuthenticationException {    **    Subject subject = this.securityManager.login(this, token);    **}

securityManager.login(this, token) login被DefaultSecurityManager

接下来几步没那么重要省略部分

ModularRealmAuthenticator AuthenticationInfo 授权信息获取方法

protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {    this.assertRealmsConfigured();    Collection<Realm> realms = this.getRealms();    return realms.size() == 1 ? this.doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken) : this.doMultiRealmAuthentication(realms, authenticationToken);}

getRealms 获取我们自己重写的Realms类,主要用户获取用户信息

接下来则进入我们自己写的Realms类 我的类叫Oauth3Realm

@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {    String accessToken = (String) token.getPrincipal();    //根据accessToken,查询用户信息    SysUserTokenEntity tokenEntity = shiroService.getByToken(accessToken);    //token失效    if(tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()){        throw new IncorrectCredentialsException(MessageUtils.getMessage(ErrorCode.TOKEN_INVALID));    }    //查询用户信息    SysUserEntity userEntity = shiroService.getUser(tokenEntity.getUserId());    //转换成UserDetail对象    UserDetail userDetail = ConvertUtils.sourceToTarget(userEntity, UserDetail.class);    //获取用户对应的部门数据权限    List<Long> deptIdList = shiroService.getDataScopeList(userDetail.getId());    userDetail.setDeptIdList(deptIdList);    //账号锁定    if(userDetail.getStatus() == 0){        throw new LockedAccountException(MessageUtils.getMessage(ErrorCode.ACCOUNT_LOCK));    }    SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userDetail, accessToken, getName());    return info;}

负责获取用户信息的方法

这并不是登录的过程,而是授权过滤的过程,通过token到数据库查询是否有这个用户,且没有过期,则证明已经登录。

到此,关于“shiro拦截认证的过程是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯