当前位置:首页 >> 计算机软件及应用 >>

shiro使用方法_图文

Shiro使用简介 核心组件 ? Subject ? SecurityManager ? Realms 核心组件 ? Subject:即“当前操作用户” ? SecurityManager:它是Shiro框架的核心,典型 的Facade模式,Shiro通过SecurityManager来管 理内部组件实例,并通过它来提供安全管理的各 种服务 ? Realm充当了Shiro与应用安全数据间的“桥梁” 或者“连接器”。也就是说,当对用户执行认证 (登录)和授权(访问控制)验证时,Shiro会从 应用配置的Realm中查找用户及其权限信息 Shiro完整架构图 其他主要组件 ? ? ? ? Authenticator :认证 ,核实用户身份 Authorizer :授权 ,访问控制 SessionManager : CacheManager :对Shiro的其他组件提供缓 存支持 Shiro认证过程 Shiro认证过程 1、应用程序构建了一个终端用户认证信息的 AuthenticationToken 实例后,调用Subject.login方法。 2、Sbuject的实例通常是DelegatingSubject类(或子类) 的实例对象,在认证开始时,会委托应用程序设置的 securityManager实例调用securityManager.login(token) 方法。 3、SecurityManager接受到token(令牌)信息后会委托内置 的Authenticator的实例(通常都是 ModularRealmAuthenticator类的实例)调用 authenticator.authenticate(token). ModularRealmAuthenticator在认证过程中会对设置的一 个或多个Realm实例进行适配,它实际上为Shiro提供了一 个可拔插的认证机制。 Shiro认证过程 4、如果在应用程序中配置了多个Realm, ModularRealmAuthenticator会根据配置的 AuthenticationStrategy(认证策略)来进行多Realm的认证 过程。在Realm被调用后,AuthenticationStrategy将对每 一个Realm的结果作出响应。 注:如果应用程序中仅配置了一个Realm,Realm将被直 接调用而无需再配置认证策略。 5、判断每一个Realm是否支持提交的token,如果支持, Realm将调用getAuthenticationInfo(token); getAuthenticationInfo 方法就是实际认证处理,我们通过 覆盖Realm的doGetAuthenticationInfo方法来编写我们自 定义的认证处理。 认证代码 Subject myadmin=SecurityUtils.getSubject(); if(!myadmin.isAuthenticated()){ UsernamePasswordToken token = new UsernamePasswordToken(account, password); token.setRememberMe(true); try { myadmin.login(token); } catch ( UnknownAccountException uae ) { message=用户名不正确; return ERROR; } 认证代码 catch ( IncorrectCredentialsException ice ) { message=密码错误; return ERROR; } catch ( LockedAccountException lae ) { message=用户被锁; return ERROR; } catch ( ExcessiveAttemptsException eae ) { message=用户名或密码错误; return ERROR; } catch ( AuthenticationException ae ) { message=用户名或密码错误; return ERROR; } } currentUser.logout(); //退出代码 Shiro授权 授权有着三个核心元素:权限、角色和用户。 权限 Shiro权限声明通常是使用以冒号分隔的表达式。 下面以实例来说明权限表达式。 可查询用户数据 User:view 可查询或编辑用户数据 User:view,edit 可对用户数据进行所有操作 User:* 或 User 可编辑id为123的用户数据 User:edit:123 角色 Shiro支持两种角色模式: 1、传统角色:一个角色代表着一系列的操作,当 需要对某一操作进行授权验证时,只需判断是否 是该角色即可。这种角色权限相对简单、模糊, 不利于扩展。 2、权限角色:一个角色拥有一个权限的集合。授 权验证时,需要判断当前角色是否拥有该权限。 这种角色权限可以对该角色进行详细的权限描述, 适合更复杂的权限设计。 授权实现 ? Shiro支持三种方式实现授权过程: 1编码实现 2注解实现 3JSP Taglig实现 Shiro授权的内部处理机制 授权流程 ? 1、在应用程序中调用授权验证方法(Subject的 isPermitted*或hasRole*等) 2、Sbuject的实例通常是DelegatingSubject类(或子类) 的实例对象,在认证开始时,会委托应用程序设置的 securityManager实例调用相应的isPermitted*或hasRole* 方法。 3、接下来SecurityManager会委托内置的Authorizer的实 例(默认是ModularRealmAuthorizer 类的实例,类似认 证实例,它同样支持一个或多个Realm实例认证)调用相 应的授权