• Shiro权限框架简单快速入门


    声明本文只适合初学者,本人也是刚接触而已,经过一段时间的研究小有收获,特来分享下希望和大家互相交流学习。

    首先配置我们的web.xml代码如下:
    1. <filter>
    2. <filter-name>shiroFilter</filter-name>
    3. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    4. </filter>
    5. <filter-mapping>
    6. <filter-name>shiroFilter</filter-name>
    7. <url-pattern>/*</url-pattern>
    8. </filter-mapping>

        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            //获取当前登陆的用户名
            String loginName = 
                  (String) principalCollection.fromRealm(getName()).iterator().next();
            //根据用户名查找对象
            User user = userService.findByLoginName(loginName);
            if(user != null) {
                SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
                //添加角色(Set集合<字符串>)
                info.setRoles(user.getGroupNameSet());
                //迭代用户对应的角色集合,为了获取角色对应的权限
                for(UserGroup g : user.getUserGroupList()) {
                    //添加permission
                    info.addStringPermissions(g.getPermissionStringList());
                }
                return info;
            }
            return null;
        }
       
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(
                AuthenticationToken authenticationToken) throws AuthenticationException {
            UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
            //根据用户名去查找对象
            User user = userService.findByLoginName(token.getUsername());
           
            if(user != null) {
              return new SimpleAuthenticationInfo(user.getName(),
                  user.getPassword(),getName());
            }
            return null;
        }

        public void setUserService(UserService userService) {
            this.userService = userService;
        }
    }

    各部分代码功能上面注释已基本解释了,我要说的是,我们平时有可能比较喜欢使用currUser对象,但是貌似在这里没有办法得到了。其实不然,首先shiro给我们提供的Subject的会话可以满足我们的需求
    Session session = subject.getSession();
    Session session = subject.getSession(boolean create);
    这些方法在概念上等同于HttpServletRequest API。第一个方法会返回Subject的现有会话,或者如果还没有会话,它会创建一个新的并将之返回。
    第二个方法接受一个布尔参数,这个参数用于判定会话不存在时是否创建新会话。一旦获得Shiro的会话,你几乎可以像使用HttpSession一样使用它。Shiro团队觉得对于Java开发者,HttpSession API用起来太舒服了,所以我们保留了它的很多感觉。当然,最大的不同在于,你可以在任何应用中使用Shiro会话,不仅限于Web应用。因此你可以再验证登陆里写这样的一句话来完成我们的代码转换SecurityUtils.getSubject().getSession().setAttribute("currUser", user);注意在异常处理里需要移除此currUser。当然官方推荐使用Subject currentUser SecurityUtils.getSubject()

    最后就是我们的Controller了。在这里我介绍登陆和退出
    @RequestMapping("/user/login")
        public String login(User user,HttpSession session) {
            try {
                SecurityUtils.getSubject().login(new UsernamePasswordToken(user.getName(), user.getPassword()));
                return "redirect:/index";
            } catch (AuthenticationException e) {
                session.setAttribute("msg","用户密码错误或用户名不存在");
                return "redirect:/user/tologin";
            }
                
        }   

    @RequestMapping("/user/exit")
        public String exit() {
            SecurityUtils.getSubject().logout();
            return "redirect:/user/login";
        }
    好了,这样基本算是完成任务了,接下来就是页面上的操作了。为此shiro还提供了相应的标签,在这里我就照搬官方的了,因为这个实在简单,大家一看就明白
    引用<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
    guest标签 
    验证当前用户是否为“访客”,即未认证(包含未记住)的用户

    1. <shiro:guest>  
    2.     Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!  
    3. </shiro:guest> 

    user标签 
    认证通过或已记住的用户

    1. <shiro:user>  
    2.     Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.  
    3. </shiro:user> 

    authenticated标签 
    已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。 
    1. <shiro:authenticated>  
    2.     <a href="updateAccount.jsp">Update your contact information</a> 
    3. </shiro:authenticated>  

    notAuthenticated标签 
    未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。
    1. <shiro:notAuthenticated>  
    2.     Please <a href="login.jsp">login</a> in order to update your credit card information.  
    3. </shiro:notAuthenticated> 

    principal 标签 
    输出当前用户信息,通常为登录帐号信息 
    1. Hello, <shiro:principal/>how are you today?  

    hasRole标签 
    验证当前用户是否属于该角色 
    1. <shiro:hasRole name="administrator">  
    2.     <a href="admin.jsp">Administer the system</a>  
    3. </shiro:hasRole> 


    lacksRole标签 
    与hasRole标签逻辑相反,当用户不属于该角色时验证通过 
    1. <shiro:lacksRole name="administrator">  
    2.     Sorry, you are not allowed to administer the system.  
    3. </shiro:lacksRole> 


    hasAnyRole标签 
    验证当前用户是否属于以下任意一个角色。
    1. <shiro:hasAnyRoles name="developer, project manager, administrator">  
    2.     You are either developer, project manager, or administrator.  
    3. </shiro:lacksRole>  

    hasPermission标签 
    验证当前用户是否拥有制定权限 

    1. <shiro:hasPermission name="user:create">  
    2.     <a href="createUser.jsp">Create new User</a>  
    3. </shiro:hasPermission> 

    lacksPermission标签 
    与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过 
    Xml代码 
    1. <shiro:hasPermission name="user:create">  
    2.     <a href="createUser.jsp">Create new User</a>  
    3. </shiro:hasPermission> 
    还有一个重要的就是数据库的设计,我把图贴出来大家一看也就明白了,我在这里简单的描述下吧
    shiro权限框架简单快速入门

    user == subject:用户,group(role):角色
    permission:权限(拥有权限比较细的情况,一般只要user和group就满足要求了)
    最后 提一下jar包,别弄错了。是shiro-all.jar。可以从官网下载http://shiro.apache.org/download.html





  • 相关阅读:
    CentOS 7中cAdvisor的安装过程
    怎么查看centos版本
    使docker命令不用加sudo的方法
    Linux进程相关函数system,fork,exec函数族的区别
    git pre-commit hook failed 解决办法
    lint-staged 教程
    用webpack将多个scss文件打包成一个css文件
    js连按键盘事件
    vscode快捷键
    vim 操作命令大全
  • 原文地址:https://www.cnblogs.com/jeffen/p/6197894.html
Copyright © 2020-2023  润新知