• shiro学习(二)


    自定义realm(主要就是自定义的realm要继承AuthorizingRealm 类,重写两个方法(一是认证,而是授权,两个方法一般要查询数据库,这里用的是模拟数据)

    public class CustomRealm extends AuthorizingRealm {
        Map<String,String> map=new HashMap<>(16);
        {
            map.put("mark","123456");
            super.setName("customRealm");
        }
        //Principal  重要,主角的意思  ,Set集合无序,且不可重复
        @Override    //z  授权
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            String username = (String) principals.getPrimaryPrincipal();
            //从数据库或者缓存中获取角色数据
            Set<String> roles=getRolesByUserName(username);
            //从数据库或者缓存中获取角色的权限数据
            Set<String> permissions=getPermissionsByUserName(username);
            //创建AuthorizationInfo授权对象
            SimpleAuthorizationInfo simpleAuthorizationInfo=
                    new SimpleAuthorizationInfo();
            //设置角色
            simpleAuthorizationInfo.setRoles(roles);
            //设置权限
            simpleAuthorizationInfo.setStringPermissions(permissions);
            return simpleAuthorizationInfo;
        }
    
        private Set<String> getPermissionsByUserName(String username) {
            //模拟数据取数据,roles的权限数据
            Set<String> permissions=new HashSet<>();
            permissions.add("user:select");
            permissions.add("user:delete");
            permissions.add("user:update");
            permissions.add("user:insert");
            return permissions;
        }
    
        private Set<String> getRolesByUserName(String username) {
            //模拟数据取数据,roles数据
                Set<String> roles=new HashSet<>();
                roles.add("admin");
                roles.add("user");
                return roles;
        }
    
        @Override   //c  认证
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            //1.从主体传过来的认证信息中,获取用户名
            String  username = (String) token.getPrincipal();
            //2.通过用户名,到数据库中获取凭证(这里不查数据库,写死)
            String password = getPasswordByUserName(username);
            if (password==null){
                return null;
            }
            //返回对象SimpleAuthenticationInfo
            SimpleAuthenticationInfo authenticationInfo=
                    new SimpleAuthenticationInfo(username,password,"customRealm");
            return authenticationInfo;
        }
    
        //模拟数据库查凭证
        private String getPasswordByUserName(String username) {
            //从map集合获取密码
            return map.get(username);
        }
    }

    测试代码

    public class CustomRealmTest {
        @Test
        public void testCustomRealm(){
            CustomRealm customRealm=new CustomRealm();
            DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
            defaultSecurityManager.setRealm(customRealm);
            SecurityUtils.setSecurityManager(defaultSecurityManager);
    
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken("mark","123456");
            //认证
            subject.login(token);
            //授权
            subject.checkRoles("admin","user");
            subject.checkPermissions("user:select","user:update");
    
    
        }
    }
  • 相关阅读:
    hdu--2578--与女孩约会
    hdu--2588--欧拉函数||容斥原理
    hdu--2586--lca_tarjan<证明tarjan这个人很流弊>
    hdu--3743--归并排序<自顶向下&&自底向上>2种写法
    hdu--4911--归并排序||树状数组
    hdu--2639--01背包第K解<不同决策的不同解法>
    hdu--2642--二维BIT
    hdu--3833--4000ms才能过的O(N^2)算法
    hdu--3835--最简单的数学..
    hdu--3836--tarjan+缩点
  • 原文地址:https://www.cnblogs.com/shiguanzui/p/11882906.html
Copyright © 2020-2023  润新知