登录组件:

  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链执行,代理代码:
FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain);<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异常;
 
 
 
 
 
 
 
 
 

IUAP--单点登录的更多相关文章

  1. 著名ERP厂商的SSO单点登录解决方案介绍一

          SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...

  2. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

  3. 细说SSO单点登录

    什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...

  4. [原创]django+ldap+memcache实现单点登录+统一认证

    前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...

  5. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  6. CAS FOR WINDOW ACTIVE DIRECTORY SSO单点登录

    一.CAS是什么? CAS(Central Authentication Service)是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(支持 ...

  7. 单点登录改进版-使用ajax分发cookie避免重定向轮询

    前言 继上一篇博文:可跨域的单点登录(SSO)实现方案[附.net代码]虽然实现了单点登录,也存在很多不合理的地方.很多热心的朋友也给出了很多指导性的意见,特别是 LoveCoder提出的意见. 在很 ...

  8. 可跨域的单点登录(SSO)实现方案【附.net代码】

    SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否 ...

  9. .net 单点登录实践

    前言 最近轮到我在小组晨会来分享知识点,突然想到单点登录,准备来分享下如何实现单点登录,所以有了下文.实现方案以及代码可能写得不是很严谨,有漏洞的地方或者错误的地方欢迎大家指正. 刚开始头脑中没有思路 ...

  10. asp.net mvc 权限过滤和单点登录(禁止重复登录)

    1.权限控制使用controller和 action来实现,权限方式有很多种,最近开发项目使用控制控制器方式实现代码如下 /// <summary> /// 用户权限控制 /// < ...

随机推荐

  1. Activiti配置实例以及Spring集成配置

    public class TestDB { public static void main(String[] args) { //1. 创建Activiti配置对象的实例 ProcessEngineC ...

  2. [转]C#中用NamedPipe进程间通信

    转自:http://blog.csdn.net/jinjazz/archive/2009/02/03/3861143.aspx 本文只是一个测试例子,核心代码是kernel32.dll中的一组wind ...

  3. Odoo文档管理/知识管理应用实践 - 上传附件

    测试环境: Odoo8.0 Odoo中的文档管理/知识管理可用于保存采购.销售.生产等一系列业务流程中产生的文件.凭证,可关联到具体的每一笔业务操作:也能用于管理公司的合同.资料,创建知识库以分享内部 ...

  4. spfa模版

    #include<bits/stdc++.h> using namespace std; int n,m;//点边 int beginn; ],v[],w[]; ],nextt[]; ]; ...

  5. Django项目:CRM(客户关系管理系统)--58--48PerfectCRM实现CRM客户报名流程学生合同

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  6. JQuery--漂亮的三目运算与jQ选择器结合代码

    $(function($) { $("input[name='timeset']").bind('click', function() { $(this).val() == 'cu ...

  7. ECMAScript 5 严格模式

    1. 变量必须使用var声明,杜绝不小心将本地变量声明成一个全局变量 在常规模式下,如果我们声明一个变量时省略了var关键字,解析引擎会自动将其声明为全局变量,但在严格模式下,会直接抛出异常,不会为我 ...

  8. struts2-OGNL表达式-OGNL与Struts2的结合

    1 OGNL表达式 OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航.OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能. 1.1 使用OGNL 导包 ...

  9. linux 三剑客命令(grep,sed ,awk)

    grep 命令 :强大的文本’搜索’工具    1.grep   -n   'word'  file_name 在file_name文件中找到word所在的所有行并显示.-n 为显示行号.     2 ...

  10. Size Balanced Tree(节点大小平衡树)

    定义 SBT也是一种自平衡二叉查找树,它的平衡原理是每棵树的大小不小于其兄弟树的子树的大小 即size(x->l)$\ge$size(x->r->l),size(x->r-&g ...