Shiro

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

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

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

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

    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相反

    shiroAuthenticated的使用

    1. #shiroAuthenticated()
    2. 登陆成功:您的用户名是:#(SESSION("username"))
    3. #end
    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的使用

    shiroHasPermission的使用

    1. 您好,您拥有了权限 permissionName1
    2. #end

    shiroHasRole的使用

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

    shiroNoAuthenticated的使用

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

    shiroNotHasRole的使用

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

    shiroPrincipal的使用

    RequiresPermissions的使用

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

    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. }

    编写一个类实现 实现接口 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. }

    其次在jboot.properties中配置即可

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