权限控制

Shiro中的过滤器 

Shiro中定义了很多过滤器:

  • 认证相关
    • anon:允许匿名访问
    • authc:必须登录后才能访问
    • logout:登出
  • 授权相关
    • roles:角色授权过滤器,给某个url设置特定的角色才能访问
    • perms:权限过滤器,给某个url设置特定权限才能访问

授权需要实现的Realm

授权需要继承AuthorizingRealm类,并重写其doGetAuthorizationInfo()方法

AuthorizingRealm类可以同时实现doGetAuthorizationInfo()doGetAuthenticationInfo()方法,因此可以在一个Realm中同时做认证跟授权

现在在配置类中给两个url分别设置不同的角色才能访问 

map.put("/admin", "roles[admin]");
map.put("/user", "roles[admin1]");

在Realm中实现用户角色赋予

在方法中实现如果是admin用户登录的就给这个用户赋予adminadmin1两个角色,其他的只赋予admin1这一个角色 

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
    // 1. 从principalCollection中来获取登录用户的信息
    Object primaryPrincipal = principal.getPrimaryPrincipal();
    // 2. 利用登录的用户信息来获取当前用户的角色或权限(可能需要查询数据库)
    Set<String> roles = new HashSet<>();
    roles.add("admin1");
    if ("admin".equals(primaryPrincipal)) {
        roles.add("admin");
    }
    // 3. 创建并返回SimpleAuthorizationInfo,并设置其roles属性
    return new SimpleAuthorizationInfo(roles);
}

在Realm中实现用户权限赋予

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    //从principals获取主身份信息
    String userCode = (String) principals.getPrimaryPrincipal();

    //根据身份信息获取权限信息
    //先链接数据库。。。
    //模拟从数据库获取数据
    List<String> permissions = new ArrayList<String>();
    permissions.add("admin:*");//用户的创建权限
    permissions.add("user:update");//用户的修改
    permissions.add("item:add");//商品的添加权限

    //查到权限数据,返回
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();

    //将List里面的权限填充进去
    simpleAuthorizationInfo.addStringPermissions(permissions);

    return simpleAuthorizationInfo;

}

权限注解

  • @RequiresAuthentication: 表示当前Subject已经通过login进行了身份验证,即Subject.isAuthenticated()返回true
  • @RequiresUser: 表示当前Subject已经身份验证或者通过记住我登录
  • @RequiresGuest: 表示当前Subject没有身份验证或者通过记住我登录,即是游客身份
  • @RequiresRoles(value = {“admin“”user“}, logical = Logical.AND):表示当前Subject需要角色adminuser
  • @RequiresPermissions(value = {“user:a”, “user:b”}, logical = Logical.OR): 表示当前Subject需要权限user:a 或者 user:b

使用shiro标签

Maven依赖

<dependency>
<groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>1.2.1</version> 
</dependency>

配置类中配置

@Bean
public ShiroDialect shiroDialect() {
    return new ShiroDialect();
}

xml配置

 

<!-- 配置shiro方言 -->
<bean name="shiroDialect" class="at.pollux.thymeleaf.shiro.dialect.ShiroDialect"/>

<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver"/>
    <property name="additionalDialects" ref="shiroDialect"/>
</bean>

 

在html中加入xmlns

<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">

例:

<button shiro:hasPermission="sys:user:add" type="button" class="btn  btn-primary" onclick="add()">
   <i class="fa fa-plus" aria-hidden="true"></i>添加
</button>

Shiro中的标签

  • <p shiro:guest=””>:  验证当前用户是否为访客,即未认证的(包含未记住的)用户
  • shiro:user=””: 认证通过或者已经记住的用户
  • shiro:authenticated=””: 已经认证通过的用户,不包括记住的用户,这是与user标签的本质区别
  • shiro:principal: 用户名
  • shiro:notAuthenticated: 未通过认证的用户,与authenticated相对应,与guest标签的区别是,该标签包含已经记住的用户
  • shiro:hasRole=”admin“: 验证当前用户是否属于该角色
  • shiro:lacksRole: hasRole逻辑相反,当用户不属于该角色时验证通过
  • shiro:hasAllRoles=”admin, user, vip”: 验证当前用户是否属于标签中列出的所有角色
  • shiro:hasAnyRoles=”admin, vip, developer”: 验证当前用户是否拥有标签中所列的任意一个用户
  • shiro:hasPermission=”user:add”: 验证当前用户是否拥有制定权限
  • shiro:lacksPermission=”user:del”: 与hasPermission逻辑相反。当前用户没有该权限时验证通过
  • shiro:hasAllPermissions=”user:add, user:del”: 验证当前用户是否拥有标签中所列的所有权限
  • shiro:hasAnyPermissions=”user:view, user:del”: 判断当前用户是否拥有标签中所列的任意一个权限
posted @ 2018-12-13 13:31  Jin同学  阅读(568)  评论(0)    收藏  举报