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"));
            
        }
  • 相关阅读:
    百度面试题
    分治法--二分查找、乘方、斐波那契数
    01-11李宁老师学Python视频课程(1):初识Python返回课程
    邮件发送的两种实现方法。
    Docker(一):Docker入门教程
    安装docker及在docker中安装python环境学
    vim编辑器的使用和CentOS有很多不同
    大一编程基础培训]==02-03-04-05课==类型
    大一编程基础培训]==08课==条件判断]==07课==Python的LIST与TUPLE数据类型
    Beautiful Soup 4.2.0 文档¶ BeautifulSoup对象内任何第一个标签入口,使用find()方法。
  • 原文地址:https://www.cnblogs.com/forever2h/p/6856386.html
Copyright © 2011-2022 走看看