zoukankan      html  css  js  c++  java
  • shiro之 自定义Realm实现授权

    1. 仅仅通过配置文件来指定权限不够灵活,并且不方便。在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息保存到了数据库中。所以需要从数据库中去获取相关的数据信息。可以使用shiro提供的JdbcRealm来实现,也可以自定义realm来实现。使用jdbcRealm往往也不够灵活。所以在实际应用大多数情况下都是自定义realm来实现。

    2. 自定义Realm需要继承AuthorizingRealm代码如下:

    /**
     * 自定义realm的实现  该realm类提供了两个方法 
     * doGetAuthenticationInfo 获取认证信息
     * doGetAuthorizationInfo 获取权限信息
     */
    public class UserRealm extends AuthorizingRealm{
        @Override
        public String getName() {
            return "userRealm";
        }
        
        //完成身份认证(从数据库中取数据)并且返回认证信息
        //如果身份认证失败 返回null
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(
                AuthenticationToken token) throws AuthenticationException {
            //获取用户输入的用户名
            String username = (String)token.getPrincipal();//获取身份信息
            System.out.println("username====="+username);
            //根据用户名到数据库查询密码信息---模拟
            //假定从数据库获取的密码为1111
            String pwd = "1111";
            //将从数据库中查询的信息封装到SimpleAuthenticationInfo中
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,pwd,getName());
            return info;
        }
        //授权的信息
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
            String username = principal.getPrimaryPrincipal().toString();
            System.out.println("授权----------");
            System.out.println("username============"+username);
            //根据用户名到数据库查询该用户对应的权限信息----模拟
            List<String> permission = new ArrayList<String>();
            permission.add("user:add");
            permission.add("user:delete");
            permission.add("user:update");
            permission.add("user:find");
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            for(String perms:permission){
                info.addStringPermission(perms);
            }
            return info;
        }
    }

    配置文件:

    [main]
    userRealm=cn.sxt.realm.UserRealm
    securityManager.realm=$userRealm
    #在realm中给定了用户信息 该用户信息可以不用配置
    [users]
    zhangsan=1111

    测试代码:

    public static void main(String[] args) {
            Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
            SecurityManager securityManager=factory.getInstance();
            SecurityUtils.setSecurityManager(securityManager);
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "1111");
            try {
                subject.login(token);
                if(subject.isAuthenticated()){
                    System.out.println("验证通过");
                }
            } catch (AuthenticationException e) {
                e.printStackTrace();
                System.out.println("验证失败");
            }
            System.out.println(subject.isPermittedAll("user:add","user:delete"));
            
        }
  • 相关阅读:
    课堂例子验证
    大道至简第三章读后感
    动手动脑例子验证
    各数相加的思路、流程图、源代码及实现截图
    大道至简第二章读后感
    《大道至简》第一章读后感
    个人冲刺08
    个人冲刺07
    构建之法读后感04
    个人冲刺06
  • 原文地址:https://www.cnblogs.com/forever2h/p/6856386.html
Copyright © 2011-2022 走看看