Shiro

目录

  • Shiro简介
  • Shiro的配置
  • Shiro的基本使用
  • Shiro的高级使用
    • 自定义 Shiro 错误信息
    • Shiro 与 Jwt 整合
    • Shiro 与 SSO(单点登录) 整合

Shiro简介

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用 Shiro 的易于理解的 API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

Shiro的配置

Jboot 默认情况下并没有依赖 shiro,因此,在在使用 Jboot 的 Shiro 模块之前,需要你添加下 Shiro 的 Maven 依赖。

  1. <dependency>
  2. <groupId>org.apache.shiro</groupId>
  3. <artifactId>shiro-core</artifactId>
  4. <version>1.3.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.shiro</groupId>
  8. <artifactId>shiro-web</artifactId>
  9. <version>1.3.2</version>
  10. </dependency>

注意:目前暂时不支持 Shiro 1.4.x 版本,晚点会添加支持。

同时,需要在 resources 目录下配置上您的 shiro.ini 配置文件,并在 jboot.porperties 添加上 jboot.shiro.ini = shiro.ini 配置。在 shiro.ini 文件里,需要在自行扩展 realm 等信息。

Shiro的使用

Jboot 的 Shiro 模块为您提供了以下12个模板指令,同时支持 Shiro 的5个 Requires 注解功能。方便您使用 Shiro。

12个Html模板指令

  • shiroAuthenticated:用户已经身份验证通过,Subject.login登录成功
  • shiroGuest:游客访问时。 但是,当用户登录成功了就不显示了
  • shiroHasAllPermission:拥有全部权限
  • shiroHasAllRoles:拥有全部角色
  • shiroHasAnyPermission:拥有任何一个权限
  • shiroHasAnyRoles:拥有任何一个角色
  • shiroHasPermission:有相应权限
  • shiroHasRole:有相应角色
  • shiroNoAuthenticated:未进行身份验证时,即没有调用Subject.login进行登录。
  • shiroNotHasPermission:没有该权限
  • shiroNotHasRole:没有该角色
  • shiroPrincipal:获取Subject Principal 身份信息

5个Controller注解

  • RequiresPermissions:需要权限才能访问这个action
  • RequiresRoles:需要角色才能访问这个action
  • RequiresAuthentication:需要授权才能访问这个action,即:SecurityUtils.getSubject().isAuthenticated()
  • RequiresUser:获取到用户信息才能访问这个action,即:SecurityUtils.getSubject().getPrincipal() != null
  • RequiresGuest:和RequiresUser相反

12个Html模板指令的使用

shiroAuthenticated的使用

  1. #shiroAuthenticated()
  2. 登陆成功:您的用户名是:#(SESSION("username"))
  3. #end

shiroGuest的使用

  1. #shiroGuest()
  2. 游客您好
  3. #end

shiroHasAllPermission的使用

  1. #shiroHasAllPermission(permissionName1,permissionName2)
  2. 您好,您拥有了权限 permissionName1permissionName2
  3. #end

shiroHasAllRoles的使用

  1. #shiroHasAllRoles(role1, role2)
  2. 您好,您拥有了角色 role1role2
  3. #end

shiroHasAnyPermission的使用

  1. #shiroHasAnyPermission(permissionName1,permissionName2)
  2. 您好,您拥有了权限 permissionName1 permissionName2
  3. #end

shiroHasAnyRoles的使用

  1. #shiroHasAllRoles(role1, role2)
  2. 您好,您拥有了角色 role1 role2
  3. #end

shiroHasPermission的使用

  1. #shiroHasPermission(permissionName1)
  2. 您好,您拥有了权限 permissionName1
  3. #end

shiroHasRole的使用

  1. #shiroHasRole(role1)
  2. 您好,您拥有了角色 role1
  3. #end

shiroNoAuthenticated的使用

  1. #shiroNoAuthenticated()
  2. 您好,您还没有登陆
  3. #end

shiroNotHasPermission的使用

  1. #shiroNotHasPermission(permissionName1)
  2. 您好,您没有权限 permissionName1
  3. #end

shiroNotHasRole的使用

  1. #shiroNotHasRole(role1)
  2. 您好,您没有角色role1
  3. #end

shiroPrincipal的使用

  1. #shiroPrincipal()
  2. 您好,您的登陆信息是:#(principal)
  3. #end

5个Controller注解的使用

RequiresPermissions的使用

  1. public class MyController extends JbootController{
  2. @RequiresPermissions("permission1")
  3. public void index(){
  4. }
  5. @RequiresPermissions(value={"permission1","permission2"},logical=Logincal.AND)
  6. public void index1(){
  7. }
  8. }

RequiresRoles的使用

  1. public class MyController extends JbootController{
  2. @RequiresRoles("role1")
  3. public void index(){
  4. }
  5. @RequiresRoles(value = {"role1","role2"},logical=Logincal.AND)
  6. public void userctener(){
  7. }
  8. }

RequiresUser、RequiresGuest、RequiresAuthentication的使用

  1. public class MyController extends JbootController{
  2. @RequiresUser
  3. public void userCenter(){
  4. }
  5. @RequiresGuest
  6. public void login(){
  7. }
  8. @RequiresAuthentication
  9. public void my(){
  10. }
  11. }

Shiro的高级使用

自定义 Shiro 错误信息

编写一个类实现 实现接口 io.jboot.component.shiro.JbootShiroInvokeListener,例如:

  1. public class MyshiroListener implements JbootShiroInvokeListener {
  2. private JbootShiroConfig config = Jboot.config(JbootShiroConfig.class);
  3. @Override
  4. public void onInvokeBefore(FixedInvocation inv) {
  5. //do nothing
  6. }
  7. @Override
  8. public void onInvokeAfter(FixedInvocation inv, AuthorizeResult result) {
  9. //说明该用户授权成功,
  10. //可以允许访问
  11. if (result.isOk()) {
  12. inv.invoke();
  13. return;
  14. }
  15. //shiro授权不成功,返回授权错误码
  16. int errorCode = result.getErrorCode();
  17. switch (errorCode) {
  18. case AuthorizeResult.ERROR_CODE_UNAUTHENTICATED:
  19. doProcessUnauthenticated(inv.getController());
  20. break;
  21. case AuthorizeResult.ERROR_CODE_UNAUTHORIZATION:
  22. doProcessuUnauthorization(inv.getController());
  23. break;
  24. default:
  25. inv.getController().renderError(404);
  26. }
  27. }
  28. public void doProcessUnauthenticated(Controller controller) {
  29. // 处理认证失败
  30. }
  31. public void doProcessuUnauthorization(Controller controller) {
  32. // 处理授权失败
  33. }
  34. };

其次在jboot.properties中配置即可

  1. jboot.shiro.invokeListener=com.xxx.MyshiroListener

Shiro 与 Jwt 整合

Shiro 与 SSO 整合