shiro(二)shiro详解(2)

简介: shiro(二)shiro详解

屏幕快照 2022-05-10 上午11.49.33.png

1、Step 1:应用程序代码调用 Subject.login 方法,传递创建好的包含终端用户的 Principals(身份)和 Credentials(凭证)的 AuthenticationToken 实例


2、Step 2:Subject 实例,通常为 DelegatingSubject(或子类)委托应用程序的 SecurityManager 通过调用 securityManager.login(token) 开始真正的验证。


3、Step3:SubjectManager 接收 token,调用内部的 Authenticator 实例调用 authenticator.authenticate(token)。 Authenticator 通常是一个 ModularRealmAuthenticator 实例,支持在身份验证中协调一个或多个Realm 实例。


4、Step 4:如果应用程序中配置了一个以上的 Realm,ModularRealmAuthenticator 实例将利用配置好的AuthenticationStrategy 来启动 Multi-Realm 认证尝试。在Realms 被身份验证调用之前,期间和以后,AuthenticationStrategy 被调用使其能够对每个Realm 的结果作出反应。


5、Step 5:每个配置的 Realm 用来帮助看它是否支持提交的AuthenticationToken。如果支持,那么支持 Realm 的 getAuthenticationInfo 方法将会伴随着提交的 token 被调用。getAuthenticationInfo 方法有效地代表一个特定 Realm 的单一的身份验证尝试。


九、注销


1、logout(注销):currentUser.logout();

2、调用 logout() 方法时,现有 Session 将失效,而且身份将失去关联(在Web 应用程序中,RememberMe cookie 将被删除)。

3、在 Subject 注销后,该 Subject 的实例被再次认为是匿名的。

4、注意:WEB 应用程序记住身份往往依靠 Cookie,然而Cookie 只能在 Response 被返回后被删除,所以建议在调用subject.logout() 后立即向终端重定向一个新的视图或页面。这样即能保证与安全相关的 Cookie 都能像预期的一样被删除。


十、授权: Authorization


1、授权:又称访问控制—控制谁有权限在应用程序中做什么。

2、授权检查的例子:用户是否能访问某个网页,编辑数据,或打使用这台打印机

3、授权的三要素:权限、角色和用户 。

4、需要在应用程序中对用户和权限建立关联:通常的做法是将权限分配给角色,然后将角色分配给一个或多个用户。

5、权限:Shiro 安全机制最核心的元素。它在应用程序中明确声明了被允许的行为。一个格式良好的权限声明可以清晰表达出用户对该资源拥有的权限。在 Shiro 中主要通过通配符表达式来完成权限的描述。


十一、角色:Role

1、角色:一个命名的实体, 通常代表一组行为或职责。 这些行为演化为在一个应用中能或者不能做的事情。角色通常分配给用户帐户

2、一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有指定的权限。这种角色权限可以对该角色进行详细的权限描述。 Shiro官方推荐使用这种方式。

3、Shiro的三种授权方式


编写代码:在 Java 代码中用像 if 和 else 块的结构执行授权检查。

JDK 的注解:可以添加授权注解给 Java 方法

JSP 标签库:可以控制基于角色和权限的JSP 页面输出。


十二、编程授权


1、通过使用 subject 的方法来实现角色的判断,常用的 API:


hasRole(String roleName)

hasRoles(List<String> roleNames)

hasAllRoles(Collection<String> roleNames)


2、断言支持:Shiro 还支持以断言的方式进行授权验证。断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息。常用方法:


checkRole(String roleName) 、

checkRoles(Collection<String>roleNames)、

checkRoles(String… roleNames)


十三、编程授权

1、基于权限对象的实现


isPermitted(Permission p)、isPermitted(List<Permission> perms)、isPermittedAll(Collection<Permission> perms)  


2、基于字符串的实现


if (currentUser.isPermitted("printer:print:laserjet4400n"))

isPermitted(String perm)、isPermitted(String... perms)、isPermittedAll(String... perms)


3、权限的实现也都可以采用断言的方式,相关方法:


checkPermission(Permission p)、checkPermission(String perm)、checkPermissions(Collection<Permission> perms)、checkPermissions(String... perms)


十四、授权的顺序

屏幕快照 2022-05-10 上午11.51.00.png屏幕快照 2022-05-10 上午11.50.54.png





Step 1:应用程序或框架代码调用任何 Subject 的hasRole*, checkRole*, isPermitted*,或者checkPermission*方法的变体,传递任何所需的权限

Step 2:Subject 的实例—通常是 DelegatingSubject(或子类),调用securityManager 的对应的方法。

Step 3:SecurityManager 调用 org.apache.shiro.authz.Authorizer 接口的对应方法。默认情况下,authorizer 实例是一个 ModularRealmAuthorizer 实例,它支持协调任何授权操作过程中的一个或多个Realm 实例。

Step 4:每个配置好的 Realm 被检查是否实现了相同的 Authorizer 接口。如果是,Realm 各自的 hasRole*, checkRole*,isPermitted*,或 checkPermission* 方法将被调用。


十五、Realm


1、Realm:访问应用程序安全数据(如用户、角色及权限)的组件。

2、Realm 通常和数据源是一对一的对应关系,如关系数据库、文件系统或其他类似资源。Realm 实质上就是一个访问安全数据的 DAO。

3、数据源通常存储身份验证数据(如密码的凭证)以及授权数据(如角色或权限),所以每个Realm 都能够执行身份验证和授权操作。


十六、Realms的认证实现


1、Shiro 的认证过程由 Realm 执行,SecurityManager 会调用 org.apache.shiro.realm.Realm 的 getAuthenticationInfo(AuthenticationToken token) 方法。


2、实际开发中,通常会提供 org.apache.shiro.realm.AuthenticatingRealm 的实现类,并在该实现类中提供 doGetAuthenticationInfo(AuthenticationToken token)方法的具体实现


1、检查提交的进行认证的令牌信息

2、根据令牌信息从数据源(通常为数据库)中获取用户信息

3、对用户信息进行匹配验证。

4、验证通过将返回一个封装了用户信息的 AuthenticationInfo 实例。

5、验证失败则抛出 AuthenticationException 异常信息。


屏幕快照 2022-05-10 上午11.51.37.png


十七、Realms的授权实现


1、Shiro 的授权过程由 org.apache.shiro.authz.Authorizer 执行,SecurityManager 会调用 Authorizer 的 对应的权限校验方法:hasRole()、isPermitted() 等。

2、Authorizer 接口调用其抽象实现类 org.apache.shiro.realm.AuthorizingRealm 的 getAuthorizationInfo(PrincipalCollection principals) 方法获取 用户所具有的权限信息。在 getAuthorizationInfo 方法中又调用 doGetAuthorizationInfo(PrincipalCollection principals) 方法来获取用户的权限信息

3、实际开发中,通常提供 org.apache.shiro.realm.AuthorizingRealm 的实现类,并提供 doGetAuthorizationInfo(PrincipalCollection principals) 方法的具体实现

屏幕快照 2022-05-10 上午11.51.47.png

目录
相关文章
|
存储 JSON 前端开发
Shiro实现记住我(十)
Shiro实现记住我(十)
434 0
Shiro实现记住我(十)
|
安全 测试技术 API
Shiro详解
Shiro详解
127 0
|
安全 Java 容器
深入理解Shiro(下)
深入理解Shiro(下)
84 0
|
安全 Java 测试技术
深入理解Shiro(上)
深入理解Shiro(上)
91 0
|
存储 缓存 安全
|
消息中间件 JavaScript 小程序
再见了 shiro
再见了 shiro
|
消息中间件 安全 JavaScript
再见了 shiro !
再见了 shiro !
|
存储 缓存 安全
2021年你还不会Shiro?----1.Shiro的架构
涉及到多用户登录的系统时都要对用户进行权限管理,权限管理属于系统安全的范畴,权限管理主要是为了实现“对用户访问系统的控制”,根据安全规则去控制用户可以访问的资源。
148 0
2021年你还不会Shiro?----1.Shiro的架构
|
缓存 安全 前端开发
|
Java 数据安全/隐私保护
shiro(二)shiro详解(1)
shiro(二)shiro详解
257 0
shiro(二)shiro详解(1)