spring集成shiro实现权限认证和自动登录

本文介绍了如何在Spring项目中集成Shiro进行用户权限认证和自动登录的实现。详细讲解了UserRealm的认证过程,ResourceCheckFilter的路径权限检查,UrlPermissionResolver的权限字符串解析,以及在spring-shiro.xml和web.xml中的配置。特别提到了SessionExpiredFilter的自定义处理,包括自动登录逻辑和登录过期请求的处理策略。

在登录入口类中先创建用户名/密码身份验证Token。

UsernamePasswordToken token = new UsernamePasswordToken(phone, password);

然后调用subject.login(token);此时SecurityManager将会委托Authenticator进行身份验证,Authenticator会将token传入Realm从Realm获取身份验证信息,如果没有返回或抛出异常表示身份验证失败。用户登录成功可以将用户身份信息放入shiroSession中,在自定义的sessionExpiredFilter类中通过判断请求的session中是否存在用户信息,处理过期的登录请求。(浏览器每次请求会将sessionId通过request传给服务端,通过sessionId获取当前用户的session信息)

  Subject subject = SecurityUtils.getSubject();
        User user = userService.getUserByPhone(phone);
        //创建用户名、密码身份验证Token
        UsernamePasswordToken token = new UsernamePasswordToken(phone, password);
        String loginToken = new Md5Hash(new Date().toString() + ShiroSession.getId()).toHex();

        try {
            subject.login(token);
            ShiroSession.set("user_info", JSON.toJSONString(user));
            //如果登录成功且设置了7天自动登录
            if (remember == true) {
                userService.updateToken(user.getPhone(), loginToken);
                //设置客户端cookie保存7天
                CookieUtil.addCookie(response, "loginToken", loginToken, 7);
            }
            return ResponseUtils.buildOKResponse(JSON.toJSONString(new User(user.getId(), user.getNickName())));

UserRealm用户权限认证:

UserRealm继承AuthorizingRealm类,实现两个方法doGetAuthenticationInfo和doGetAuthorizationInfo
在doGetAuthenticationInfo中从通过
String phone = (String) token.getPrincipal();获得角色信息
String password = new String((char[]) token.getCredentials());获得登录密码
然后与从数据库中查询出的用户密码进行匹配,进行判断逻辑处理,无误后将用户的登录信息存入SimpleAuthenticationInfo并返回:

SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(
phone,
password,
ByteSource.Util.bytes(phone),//设置username、pwd都没问题
getName() //realm name(唯一)
);
return info;

在doGetAuthorizationInfo类中主要实现对已认证的用户分配资源权限:
String phone = (String) principalCollection.getPrimaryPrincipal();获得认证用户,然后通过自定义的getResourcesByUserId方法获取用户资源列表,放入HashSet中,最后调用SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setStringPermissions(new HashSet<>(permissions));将集合内容填充到认证中

ResourceCheckFilter访问路径的认证

ResourceCheckFilter继承AccessControlFilter实现两个方法isAccessAllowed和onAccessDenied,负责访问路径的认证判断:

@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o)
            throws Exception {
        Subject 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值