spring集成shiro Part04

这节说下 集成权限,这块先讲一下权限控制到角色粒度
总结下步骤先,
1.编辑资源对应的权限控制类,哪些url需要哪些角色才能访问
2.修改realm类中的授权方法
贴代码:
1.编辑资源对应的权限控制类,哪些url需要哪些角色才能访问

package com.ithaha.shiro;

import java.util.LinkedHashMap;

/**
 * @author lf
 * @Title: FilterChainDefinitionMapBulider
 * @Description: 资源权限管理类
 * @date 2018/8/24 9:38
 */
public class FilterChainDefinitionMapBulider {
    public LinkedHashMap<String,String> buildFilterChainDefinitionMap(){

        LinkedHashMap<String ,String> res = new LinkedHashMap<String, String>();
        //以下数据都可以通过数据库读取获取
        //map中填入的值,,,key:url value:对应url的过滤器
        // anon 匿名可以访问(即不用认证就可以)
        res.put("/login.jsp","anon");
        res.put("/user/login","anon");
        //roles 角色拦截器 (authc 认证过)
        res.put("/user.jsp","authc,roles[user]");
        res.put("/admin.jsp","authc,roles[admin]");
        //user 拦截器 认证过 或者 记住我了 就可以访问
        res.put("/list.jsp","user");
        //permission拦截器
        res.put("/permission","perms[user:create]");
        //logout 登出拦截器 前端 访问 /user/logout 就可以退出了
        res.put("/user/logout","logout");
        //authc 表单拦截器需要认证过才可以访问
        res.put("/**","authc");
        return res;
    }
}

2.修改realm类中的授权方法

package com.ithaha.shiro.realms;

import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import java.util.HashSet;
import java.util.Set;

/**
 * @author lf
 * @Title: AuthorizationShiroRelam
 * @Description: TODO
 * @date 2018/7/23 14:11
 */
public class AuthorizationShiroRelam extends AuthorizingRealm {
    //授权验证
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
       //获取当前登陆对象 用户名
        Object principal = principalCollection.getPrimaryPrincipal();
        //获取当前登陆用户的角色(可以去数据库中查询)
        Set<String> roles = new HashSet<String>();
        roles.add("user"); //这里应该可以做到 方法粒度url
        if("admin".equals(principal)){
            roles.add("admin");
        }
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(roles);
        //创建返回对象
        return authorizationInfo;
    }
    //认证验证
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        String username = token.getUsername();
        //判断username是否存在
        Object hashedCredentials= null; //密码
        if("admin".equals(username)){
            hashedCredentials = "ce2f6417c7e1d32c1d81a797ee0b499f87c5de06";
        }else if("user".equals(username)){
            hashedCredentials = "073d4c3ae812935f23cb3f2a71943f49e082a718";
        }else{
            throw new UnknownAccountException("用户不存在");
        }
        //设置返回值
        Object principal = username;
        ByteSource credentialsSalt = ByteSource.Util.bytes(username);
        return new SimpleAuthenticationInfo( principal,  hashedCredentials,  credentialsSalt, getName()) ;
    }
}

嗯这样配置一下 ,就好了,我给所有用户都加了user的角色,admin有admin的角色,当某个角色访问自己没有权限访问的页面时,就会自动跳转到配置的未授权的页面

这里在顺带说一下 remember me这个功能,他存在的意义就在于用户登陆之后,选中了记住我,当他关闭浏览器后,在一定时间内 有些页面还是可以访问的,而有些页面是不需要重新登陆才可以访问的,
这个需要几个东西来配合
1.你要设置哪些页面是可以通过remember me来访问的 使用user过滤器
2.在登陆方法中 将remember me设置为true
3.在security Manager 中配置remember 的有效时长
贴一下代码:
1.你要设置哪些页面是可以通过remember me来访问的 使用user过滤器
这里写图片描述
2.在登陆方法中 将remember me设置为true
这里写图片描述
3.在security Manager 中配置remember 的有效时长
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值