Shiro权限框架简单快速入门

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

首先配置咱们的web.xml代码以下:
           
           
           
           
<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </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



相关文章
相关标签/搜索