[关闭]
@javazjm 2017-11-24T03:08:33.000000Z 字数 4793 阅读 1917

Springboot系列学习十五:shiro权限控制

Springboot Shiro


springboot + thymeleaf + shiro 整合

1. 引入jar

  1. <dependencies>
  2. <!-- 使用jpa -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-data-jpa</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <!-- mysql -->
  12. <dependency>
  13. <groupId>mysql</groupId>
  14. <artifactId>mysql-connector-java</artifactId>
  15. <scope>runtime</scope>
  16. </dependency>
  17. <!-- 页面使用 thymeleaf-->
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  21. </dependency>
  22. <!-- Thymeleaf关闭标签校验mode,在配置文件中指定spring.thymeleaf.mode=LEGACYHTML5-->
  23. <dependency>
  24. <groupId>net.sourceforge.nekohtml</groupId>
  25. <artifactId>nekohtml</artifactId>
  26. <version>1.9.22</version>
  27. </dependency>
  28. <!-- shiro spring. -->
  29. <dependency>
  30. <groupId>org.apache.shiro</groupId>
  31. <artifactId>shiro-spring</artifactId>
  32. <version>1.2.2</version>
  33. </dependency>
  34. </dependencies>

2. application.yml配置文件

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/shiro
  4. username: zjm
  5. password: 123456
  6. #schema: database/import.sql
  7. #sql-script-encoding: utf-8
  8. driver-class-name: com.mysql.jdbc.Driver
  9. jpa:
  10. database: mysql
  11. show-sql: true
  12. hibernate:
  13. ddl-auto: update
  14. naming:
  15. strategy: org.hibernate.cfg.DefaultComponentSafeNamingStrategy
  16. properties:
  17. hibernate:
  18. dialect: org.hibernate.dialect.MySQL5Dialect
  19. thymeleaf:
  20. cache: false
  21. mode: LEGACYHTML5
  22. server:
  23. port: 8081

3.开始编码

1. 新建实体

  1. @ManyToMany(fetch = FetchType.EAGER)//立即从数据库中进行加载数据;
  2. @JoinTable(name = "SysUserRole", joinColumns = {@JoinColumn(name = "uid")}, inverseJoinColumns = {@JoinColumn(name = "roleId")})
  3. private List<SysRole> roleList;
  1. /**
  2. * 用户 -- 角色关系定义;
  3. */
  4. @ManyToMany
  5. @JoinTable(name = "SysUserRole",joinColumns = {@JoinColumn(name = "roleId")},inverseJoinColumns = {@JoinColumn(name = "uid")})
  6. private List<UserInfo> userInfos;
  7. /**
  8. * 角色 -- 权限关系:多对多关系;
  9. */
  10. @ManyToMany(fetch = FetchType.EAGER)
  11. @JoinTable(name = "SysRolePermission", joinColumns = {@JoinColumn(name = "roleId")}, inverseJoinColumns = {@JoinColumn(name = "permissionId")})
  12. private List<SysPermission> permissions;
  1. /**
  2. * 权限可赋给多个角色
  3. */
  4. @ManyToMany
  5. @JoinTable(name = "SysRolePermission", joinColumns = {@JoinColumn(name = "permissionId")}, inverseJoinColumns = {@JoinColumn(name = "roleId")})
  6. private List<SysRole> roles;

注意:
1. "SysUserRole"、"SysRolePermission"是生成的中间表名称,对应于数据库中的“sys_user_role”和“sys_role_permission”
2. SysRole中的"uid"、"roleId"、"permissionId"需与UserInfo、SysPermission中的对应

2. dao层

jpa用法,直接继承CrudRepository即可

3. service层

不多说了,都懂

4. controller层

登录实现

登录过程其实只是处理异常的相关信息,具体的登录验证交给shiro来处理

退出实现

shiro内置退出方法,直接调用SecurityUtils.getSubject().logout();

5. 新建页面

6. shiro配置文件

ShiroConfig

Apache Shiro 核心通过 Filter 来实现,通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。

Filter Chain定义说明:

  1. 一个URL可以配置多个Filter,使用逗号分隔
  2. 当设置多个过滤器时,全部验证通过,才视为通过
  3. 部分过滤器可指定参数,如perms,roles

Shiro内置的FilterChain

Filter Name Class
anon org.apache.shiro.web.filter.authc.AnonymousFilter
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
port org.apache.shiro.web.filter.authz.PortFilter
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
ssl org.apache.shiro.web.filter.authz.SslFilter
user org.apache.shiro.web.filter.authc.UserFilter

- anon:所有url都都可以匿名访问
- authc: 需要认证才能进行访问
- user:配置记住我或认证通过可以访问

MyShiroRealm

登录认证的实现

doGetAuthenticationInfo(AuthenticationToken token)
在Shiro中,最终是通过Realm来获取应用程序中的用户、角色及权限信息的。通常情况下,在Realm中会直接从我们的数据源中获取Shiro需要的验证信息。可以说,Realm是专用于安全框架的DAO. Shiro的认证过程最终会交由Realm执行,这时会调用Realm的getAuthenticationInfo(token)方法。

链接权限的实现

doGetAuthorizationInfo(PrincipalCollection principals)
如果只是简单的身份认证没有权限的控制的话,可直接返回null;
当访问页面时,链接配置了相应权限(@RequiresPermissions("userInfo:view"))或shiro标签()才执行此方法

springboot thymeleaf和shiro标签整合

1.添加依赖

  1. <dependency>
  2. <groupId>com.github.theborakompanioni</groupId>
  3. <artifactId>thymeleaf-extras-shiro</artifactId>
  4. <version>1.2.1</version>
  5. </dependency>

2.在shiro的配置文件 ShiroConfig 中添加

  1. @Bean
  2. public ShiroDialect shiroDialect() {
  3. return new ShiroDialect();
  4. }

3.在html中加入xmlns

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

4.例子

  1. <span shiro:authenticated="true" >
  2. <span>欢迎您:<span th:text="${userInfo.realName}"></span></span>
  3. </span>

至此,shiro的权限校验完成了,后期可以加入一些动态权限管理和缓存、“记住我”、“GIF验证码”
等功能。

TODO

RememberMe

参考

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注