Shiro 简介

image.png

Shiro是Apache的开源安全框架,提供了登录认证,授权,加密,会话管理,缓存管理等功能。

核心概念

Shiro包含了如下三个核心概念:

  • Subject:主体,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是其他的程序。Subject 代表了当前用户的安全操作,SecurityManager 则管理所有用户的安全操作。
  • SecurityManager:安全管理器,管理着所有的Subject,是Shiro的核心,与其他组件交互,例如会话管理,缓存管理
  • Ream:意思为领域或者国度。起到一个桥梁的作用,主要通过realm来获取用户相关的安全数据,例如获取用户在数据库中的密码信息,角色信息,操作权限信息等。Shiro内置了2个Realm,分别是IniRealm和JdbcRealm,但是不常用,一般情况下都需要我们自己来自定义实现。

一般我们需要继承 org.apache.shiro.realm.AuthorizingRealm,然后实现其中父类的2个抽象方法。

  // 自定义Realm
  public class CustomRealm extends AuthorizingRealm {

    // 授权,验证用户的角色和操作权限
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { 
          //....
    }

    // 认证,验证登录的用户名和密码是否正确
   @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
          //....
    }

  }

整体流程

用户通过Subject来进行认证和授权,而Subject又委托给SecurityManager,而SecurityManager又需要通过我们自定义的Realm来获取密码,权限等数据来进行校验和比对

image.png

过滤器

Shiro还提供了过滤器,可以配置我们的过滤规则,过滤规则对顺序是有要求的,短路优先原则,也就是前面的适配成功之后,就不会再适配后面的规则了。

/user/**=anon
/user/list=authc 永远不会执行

过滤规则说明:
其中anonauthc等为Shiro为我们实现的过滤器,具体如下表所示:

Filter Name Class Description
anon org.apache.shiro.web.filter.authc.AnonymousFilter 匿名拦截器,即不需要登录即可访问;一般用于静态资源过滤;示例/static/**=anon
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter 基于表单的拦截器;如/**=authc,如果没有登录会跳到相应的登录页面登录
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter Basic HTTP身份验证拦截器
logout org.apache.shiro.web.filter.authc.LogoutFilter 退出拦截器,主要属性:redirectUrl:退出成功后重定向的地址(/),示例/logout=logout
noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter 不创建会话拦截器,调用subject.getSession(false)不会有什么问题,但是如果subject.getSession(true)将抛出DisabledSessionException异常
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter 权限授权拦截器,验证用户是否拥有所有权限;属性和roles一样;示例/user/**=perms["user:create"]
port org.apache.shiro.web.filter.authz.PortFilter 端口拦截器,主要属性port(80):可以通过的端口;示例/test= port[80],如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter rest风格拦截器,自动根据请求方法构建权限字符串;示例/users=rest[user],会自动拼出user:read,user:create,user:update,user:delete权限字符串进行权限匹配(所有都得匹配,isPermittedAll)
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 角色授权拦截器,验证用户是否拥有所有角色;示例/admin/**=roles[admin]
ssl org.apache.shiro.web.filter.authz.SslFilter SSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口443;其他和port拦截器一样;
user org.apache.shiro.web.filter.authc.UserFilter 用户拦截器,用户已经身份验证/记住我登录的都可;示例/**=user

我们也可以自定义实现过滤器,如果是授权相关,则继承org.apache.shiro.web.filter.authz.AuthorizationFilter,如果是认证则继承AuthenticatingFilter

你可能感兴趣的:(Shiro 简介)