IUAP--单点登录

登录组件:

  1. 提供统一的登录组件
  2. 身份、证明验证身份
  3. 支持多种身份标识,用户名、邮箱、手机号
  4. 支持多个域,从与得到用户响应的角色,权限进行验证用户时候能进行操作。
  5. 支持会话管理和安全管理
  6. 支持多种验证策略,并支持扩展
权限框架:
  1. 提供了用户、角色、功能、数据权限、用户角色关联、角色权限关联模型及维护api
  2. 提供认证、授权、加密、会话管理与web集成、缓存等功能
  3. 权限结构基于RBAC模型,用户关联角色,角色关联功能。
  4. 功能根据自定义策略可自行扩展
  5. 提供拦截器即只对权限进行控制
  6. 提供缓存机制,降低读消耗

工作流程中:

token:令牌代表执行某些操作的权利的对象,如最简单的用户名和密码组成了一个token
credentials:证明、凭证,只有主体知道的安全值,如密码、数字证书,最常见的credentials就是密码了
subject:主体,代表了当前用户,这个用户不一定是一个具体的人,与当前应用交互的任何东西是subject,如网络爬虫,一个抽象概念概念
Realm:域,shiro从Realm获取安全数据(如用户,角色,权限),就是说SecurityManager要验证用户身份,那么他需要从Realm获取相应的用户进行比较已确定用户身份时候合法(登录),也需要从Realm得到用户相应的 角色,权限进行验证用户是否能进行操作,可以把Realm看成DataSource,即安全数据源。
 
注意:Shiro不知道你的用户、权限存储在哪及以何种格式存储,所以我们一般在应用中都需要实现自己的Realm
 
Session Manager:回话管理,用户登录一次就是一次会话,在没有退出之前,它到所有信息都在会话中,会话可以是普通的JavaSE,也可以是Web环境。
 
SecurityManager: 安全管理器,即所有与安全有关的的操作都会与SecurityManager交互,所有Subject都绑定到SecurityManager所有的交互都会委托到SecurityManager,可以吧Subject认为是一个门面,SecurityManager才是实际的执行者。
 
Permissions:权限,是Apache Shiro中安全策略最基本的元素,是一组关于行为的基本指令,已明确表示在一个程序中什么可以做,权限指令只描述行为,不关注谁有这个能力。
 
Roles:角色,是一个实体名,代表一组行为和职责,角色通常赋给用户帐户,关联之后,用户就可以做属于不用角色的事情。
 
Users:用户,在Shiro中,Subject实际上就是“用户”,用户可以通过角色或者权限关联来确定是否被允许执行程序内特定的动作,程序数据模型Subject是否允许做什么事情。
 
 
 
  1. 应用程序构建一个用户认证信息的AuthenticationToken实例之后,调用Subject.login(token)进行登录,其会自动委托给Security Manager。其中 ,AuthenticationToken中包含了终端用户的PrincipalsCredentials

  2. Subject实例通常是DelegatingSubject类(或者子类)的实例对象,在认证时,会委托应用程序设置的securityManager实例调用securityManager.login(token) 
    SecurityManager负责真正的身份验证逻辑,它会委托给Authenticator进行身份验证。

  3. SecurityManager接收到token信息后委托给Authenticator的实例(通常是ModularRealmAuthentication类的实例,Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现),调用authenticator. authenticate(token)ModularRealmAuthentication在认证中会对设置的一个或者多个Realm实例进行适配,实际上为Shiro提供了一个可插拔的认证机制。

  4. Authenticator可能会委托给相应的Authentication Strategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证。在Realm被调用后,Authentication将对每一个Realm的结果作出相应。

  5. Authenticator会把相应的token传入RealmRealm将调用getAuthenticationInfo(token)(此方法就是实际认证处理,我们需要覆盖RealmdoGetAuthenticationInfo方法来编写自己的认证处理),从Realm获取身份验证信息,如果返回false或者抛出异常,则表示身份验证失败了。

 
 拦截器介绍:
1、与Servlet一样的Filter接口进行扩展,对Servlet容器的FilterChain进行了代理,即shiroFilter在Servlet容器的Filter链的执行之前,通过ProxiedFilterChain对Servlet容器的FilterChain进行了代理,即先走了 Shiro自己的Filter体系,然后委托给了Servlet的FilterChain进行Servlet容器级别的Filter链执行,代理代码:
<wiz_code_mirror>
 
 
 
 
 
xxxxxxxxxx
1
 
 
 
1
FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain);
 
 
    即传入原始的Chain得到了一个代理的Chain。
2、先执行Shiro自己的Filter链
 
3、执行Servlet容器的Filter链
 
4、默认拦截器
 
名称 拦截器 说明
身份验证相关的    
authc     org.apache.shiro.web.filter.authc.FormAuthenticationFilter 基于表单的拦截器;如"/** = statelessAuthc",如果没有登录会跳到相应的登录页面登录;主要属性:usernameParam:表单提交的用户名参数名( username);
passwordParam:表单提交的密码参数名(password); rememberMeParam:表单提交的密码参数名(rememberMe); loginUrl:登录页面地址(/login.jsp);successUrl:登录成功后的默认重定向地址;
failureKeyAttribute:登录失败后错误信息存储key(shiroLoginFailure); 
authc org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter Basic HTTP 身份验证拦截器,主要属性,applicationName:弹出登陆框显示的信息(application)
logout     org.apache.shiro.web.filter.authc.LogoutFilter     退出拦截器,主要属性:redirectUrl:退出成功后重定向的地址(/)
"/logout = logout"
user     org.apache.shiro.web.filter.authc.UserFilter     用户拦截,用户已经身份验证、记住我登录的都可,实例“/** = user ”
anno     org.apache.shiro.web.filter.authc.AnonymousFilter     匿名拦截器,既不需要登录即可访问,一般用于静态资源过滤
 /static/** = anon /css/** = anon
 /images/** = anon /trd/** = anon
 /js/** = anon     /api/** = anon
 /cxf/** = anon    /jaxrs/** = anon
授权相关的    
roles     org.apache.shiro.web.filter.authz
.RolesAuthorizationFilter
角色授权拦截器,验证用户是否拥有所有角色;主要属性: loginUrl:登录页面地址(/login.jsp);unauthorizedUrl:未授权后重定向的地址;示例“/admin/**=roles[admin]”
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风格拦截器,自动根据请求方法构建权限字符串(GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read,
MKCOL=create)构建权限字符串;示例“/users=rest[user]”,会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配(所有都得匹配,isPermittedAll); 
ssl     org.apache.shiro.web.filter.authz
.SslFilter
SSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口(443);其他和port拦截器一样;
其他    
noSessionCreation org.apache.shiro.web.filter.session
.NoSessionCreationFilter
不创建会话拦截器,调用
subject.getSession(false)不会有什么问题,但是如果
subject.getSession(true)将抛出 DisabledSessionException异常;
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/holddie/p/7082283.html