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"));
            
        }
  • 相关阅读:
    The network connection was lost 文件下载错误提示
    ThinkPHP第一课 环境搭建
    Docs-.NET-C#-指南-语言参考-关键字-值类型:内置数值转换
    Docs-.NET-C#-指南-语言参考-关键字-值类型-:浮点数值类型
    Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型
    Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能
    Docs-.NET-C#-指南-语言参考-关键字:C# 关键字
    Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma checksum(C# 参考)
    Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma warning(C# 参考)
    Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma(C# 参考)
  • 原文地址:https://www.cnblogs.com/forever2h/p/6856386.html
Copyright © 2011-2022 走看看