SpingBoot 整合Shiro

885 阅读5分钟

pom文件

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

		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-web</artifactId>
			<version>1.4.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>1.4.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.0</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.10</version>
		</dependency>

		<!--热部署-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>

Shiro常用标签

在HTML中使用Shiro标签前需要在ShiroConfig配置类中配置如下:

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

同时HTML文件中需要引入:

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

常用标签
guest 标签:用户没有身份验证时显示相应信息,即游客访问信息,不过好像用处不大:

<h3 shiro:guest>游客可以访问</h3>

user 标签: 登录可以访问:

<div shiro:user>
    登录可以访问
</div>

principal 标签:显示当前用户的用户名:

<h2 shiro:principal></h2>

hasRole 标签: 如果当前Subject拥有指定角色将显示标签体内的内容:

<a shiro:hasRole="admin" th:href="@{/admin}">admin</a>

hasAnyRoles 标签: 如果当前Subject有任意一个角色(或的关系)将显示标签体内的内容 :

<p shiro:hasAnyRoles="admin,user">拥有一个角色就行</p>

lacksRole 标签 :如果当前 Subject 没有指定的角色将显示标签体内容:

<p shiro:lacksRole="admin">没有admin角色的才可以显示</p>

hasPermission 标签:如果当前 Subject 有指定权限将显示标签体内容:

<p shiro:hasPermission="admin:create">拥有指定权限的显示</p>

lacksPermission 标签与上面相反

Shiro注解

使用注解需在ShiroConfig中配置如下:

/* 开启注解支持 */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor
                = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
        return authorizationAttributeSourceAdvisor;
    }

    /* 开启注解支持 */
    @Bean
    @ConditionalOnMissingBean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator app = new DefaultAdvisorAutoProxyCreator();
        app.setProxyTargetClass(true);
        return app;
    }

注解
Shiro的注解一般用在Controller层和Serivce层

  • @RequiresAuthentication:表示当前Subject已经通过login 进行了身份验证;即 Subject. isAuthenticated() 返回 true
  • @RequiresUser:表示当前 Subject 已经身份验证或者通过记 住我登录的
  • @RequiresGuest:表示当前Subject没有身份验证或通过记住 我登录过,即是游客身份
  • @RequiresRoles注解:表示当前Subject需要指定的角色才能访问,可以有多个角色,默认是AND的关系, 可以改为OR的关系
@RequiresRoles(value={"admin", "user"}) //默认为AND的关系
@RequiresRoles(value = {"admin","user"},logical = Logical.OR)//此时为OR的关系
  • @RequiresPermissions注解:表示当前 Subject 需要指定的权限,可以拥有多个权限,默认是AND的关系,也可改为OR的关系
@RequiresPermissions (value={"user:view:1", "user:b"})

权限的写法

  1. 单个资源单个权限
    currentUser.checkPermissions("system:user:update");用户拥有资源“system:user”的“update”权限。
  2. 单个资源多个权限
    role41=system:user:update,system:user:delete 然后通过如下代码判断subject().checkPermissions("system:user:update", "system:user:delete");
    用户拥有资源“system:user”的“update”和“delete”权限。
    如上可以简写成: (表示角色4拥有system:user资源的update和delete权限) role42="system:user:update,delete" 接着可以通过如下代码判断 subject().checkPermissions("system:user:update,delete");
    通过“system:user:update,delete”验证"system:user:update, system:user:delete"是没问题的,但是反过来是规则不成立。
  3. 单个资源全部权限 role51="system:user:create,update,delete,view"
    然后通过如下代码判断 subject().checkPermissions("system:user:create,delete,update:view");
    用户拥有资源“system:user”的“create”、“update”、“delete”和“view”所有权限。
    如上可以简写成: (表示角色5拥有system:user的所有权限) role52=system:user:* 也可以简写为(推荐上边的写法): role53=system:user 然后通过如下代码判断
    subject().checkPermissions("system:user:"); subject().checkPermissions("system:user"); 通过“system:user:”验证“system:user:create,delete,update:view”可以,但是反过来是不成立的。
  4. 所有资源全部权限
    ini配置
    role61=:view 然后通过如下代码判断
    subject().checkPermissions("user:view");
    用户拥有所有资源的“view”所有权限。假设判断的权限是“"system:user:view”,那么需要“role5=
    :*:view”这样写才行。
  5. 实例级别的权限
    5.1 单个实例单个权限
    role71=user:view:1
    对资源user的1实例拥有view权限。
    然后通过如下代码判断
    subject().checkPermissions("user:view:1");
    5.2 单个实例多个权限
    role72="user:update,delete:1"
    对资源user的1实例拥有update、delete权限。
    然后通过如下代码判断
    subject().checkPermissions("user:delete,update:1");
    subject().checkPermissions("user:update:1", "user:delete:1");
    5.3 单个实例所有权限
    role73=user::1
    对资源user的1实例拥有所有权限。
    然后通过如下代码判断
    subject().checkPermissions("user:update:1", "user:delete:1", "user:view:1");
    5.4 所有实例单个权限
    role74=user:auth:

    对资源user的1实例拥有所有权限。
    然后通过如下代码判断
    subject().checkPermissions("user:auth:1", "user:auth:2");
    5.5 所有实例所有权限
    role75=user::
    对资源user的1实例拥有所有权限。
    然后通过如下代码判断
    subject().checkPermissions("user:view:1", "user:auth:2");
  6. Shiro对权限字符串缺失部分的处理
    如“user:view”等价于“user:view:”;
    而“organization”等价于“organization:
    ”或者“organization::”。
    可以这么理解,这种方式实现了前缀匹配。
    另外如“user:”可以匹配如“user:delete”、“user:delete”可以匹配如“user:delete:1”、“user::1”可以匹配如“user:view:1”、“user”可以匹配“user:view”或“user:view:1”等。即可以匹配所有,不加可以进行前缀匹配;
    但是如“:view”不能匹配“system:user:view”,需要使用“::view”,即后缀匹配必须指定前缀(多个冒号就需要多个来匹配)。

具体整合的项目地址

项目地址--->