zoukankan      html  css  js  c++  java
  • 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 a developer, project manager, or administrator.  
    3. </shiro:lacksRole>  

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

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

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

    user == subject:用户,group(role):角色
    permission:权限(拥有权限比较细的情况,一般只要user和group就满足要求了)
    最后 提一下jar包,别弄错了。是shiro-all.jar。可以从官网下载http://shiro.apache.org/download.html
     
     
     
     
  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/jdbn/p/11059522.html
Copyright © 2011-2022 走看看