将Shiro作为应用的权限基础三基于注解实现的授权认证过程_第1页
将Shiro作为应用的权限基础三基于注解实现的授权认证过程_第2页
将Shiro作为应用的权限基础三基于注解实现的授权认证过程_第3页
将Shiro作为应用的权限基础三基于注解实现的授权认证过程_第4页
将Shiro作为应用的权限基础三基于注解实现的授权认证过程_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限。如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等。一、用户权限模型为实现一个较为灵活的用户权限数据模型,通常把用户信息单独用一个实体表示,用户权限信息用两个实体表示。用户信息用 LoginAccount 表示,最简单的用户信息可能只包含用户名 loginName 及密码 password 两个属性。实际应用中可能会包含用户是否被禁用,用户信息是否过期等信息。用户权限信息用 Role 与 Permission 表示,Role 与 Permission 之间构成多对多关系。Permission 可以理解为

2、对一个资源的操作,Role 可以简单理解为 Permission 的集合。用户信息与 Role 之间构成多对多关系。表示同一个用户可以拥有多个 Role,一个 Role 可以被多个用户所拥有。权限声明及粒度Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表达式可以清晰的指定资源类型,允许的操作。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。下面以实例来说明权限表达式。可查询用户数据User:view可查询或编辑用户数据User:view,edit可对用户数据进行所有操作User:*或 user可编辑id为123的用户数据User:edit:123

3、授权处理过程认证通过后接受 Shiro 授权检查,授权验证时,需要判断当前角色是否拥有该权限。只有授权通过,才可以访问受保护 URL 对应的资源,否则跳转到“未经授权页面”。如果我们自定义Realm实现,比如我后面的例子中,自定义了ShiroDbRealm类,当访问被RequiresPermissions注解的方法时,会先执行ShiroDbRealm.doGetAuthorizationInfo()进行授权。ControllerRequestMapping(value = /user)public class UserController Resource(name=userService)p

4、rivate IUserService userService;/* * 测试权限 * 只有拥有 user:create权限,才能进行注册 * param user * return */RequestMapping(value = /register)ResponseBodyRequiresPermissions(user:create)public boolean register(User user)return userService.register(user);二、授权实现Shiro支持三种方式实现授权过程:o 编码实现o 注解实现o JSP Taglig实现1、基于编码的授权实现

5、1、基于权限对象的实现创建org.apache.shiro.authz.Permission的实例,将该实例对象作为参数传递给Subject.isPermitted()进行验证。Permission printPermission = new PrinterPermission(laserjet4400n, print); Subject currentUser = SecurityUtils.getSubject(); if (currentUser.isPermitted(printPermission) /show the Print button else /dont show the

6、 button? Grey it out? 2、基于字符串的实现相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。Subject currentUser = SecurityUtils.getSubject();if (currentUser.isPermitted(printer:print:laserjet4400n) /show the Print button else /dont show the button? Grey it out? 使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission默认

7、支持的实现方式。这里分别代表了资源类型:操作:资源ID2、基于注解的授权实现Shiro注解支持AspectJ、Spring、Google-Guice等,可根据应用进行不同的配置。相关的注解:RequiresAuthentication可以用户类/属性/方法,用于表明当前用户需是经过认证的用户。RequiresAuthentication public void updateAccount(Account userAccount) /this method will only be invoked by a /Subject that is guaranteed authenticated .

8、RequiresPermissions当前用户需拥有制定权限RequiresPermissions(account:create) public void createAccount(Account account) /this method will only be invoked by a Subject /that is permitted to create an account . 3、基于JSPTAG的授权实现Shiro提供了一套JSP标签库来实现页面级的授权控制。在使用Shiro标签库前,首先需要在JSP引入shiro标签:hasRole标签: 验证当前用户是否属于该角色 Adm

9、inister the system hasPermission标签:验证当前用户是否拥有制定权限 Create a new User 三、Shiro授权的内部处理机制1、在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等)2、Sbuject会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。3、接下来SecurityManager会委托内置的Authorizer的实例(默认是ModularRealmAuthorizer类的实例,类似认证实例)调用相应的授权方法。4、每一个Realm将检查是否实

10、现了相同的Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。四、授权代码UserController:处理用户登录后的请求(注册)package org.shiro.demo.controller;import javax.annotation.Resource;import org.apache.shiro.authz.annotation.RequiresPermissions;import org.apache.shiro.authz.annotation.RequiresRoles;import org.springframework.stereotype.C

11、ontroller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.shiro.demo.entity.User;import org.shiro.demo.service.IUserService;ControllerRequestMapping(value = /user)public class UserController Resource(name=userServic

12、e)private IUserService userService;/* * 测试权限 * 只有拥有 user:create 权限,才能进行注册 * param user * return */RequestMapping(value = /register)ResponseBodyRequiresPermissions(user:create)public boolean register(User user)return userService.register(user);/* * 测试角色 * 只有拥有 administrator 角色,才能跳转到register页面 * retur

13、n */RequestMapping(value = /toRegister)RequiresRoles(administrator)public String toRegister()return /system/user/register;ShiroDbRealm:自定义的指定Shiro验证用户授权的类package org.shiro.demo.service.realm;import java.util.ArrayList;import java.util.List; import javax.annotation.Resource; import mons

14、.lang.StringUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shir

15、o.authz.AuthorizationException;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.shiro.demo.entity.Permission;import org.shiro.demo.entity

16、.Role;import org.shiro.demo.entity.User;import org.shiro.demo.service.IUserService; /* * 自定义的指定Shiro验证用户登录的类 * author TCH * */public class ShiroDbRealm extends AuthorizingRealm /Resource(name=userService)private IUserService userService;public void setUserService(IUserService userService) this.userS

17、ervice= userService; /* * 为当前登录的Subject授予角色和权限 * see 经测试:本例中该方法的调用时机为需授权资源被访问时 * see经测试:并且每次访问需授权资源时都会执行该方法中的逻辑,* 这表明本例未启用AuthorizationCache * seeweb层可以有shiro的缓存,dao层可以配有hibernate的缓存(后面介绍) */protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) /获取当前登录的用户名,等价于(String)/pr

18、incipals.fromRealm(this.getName().iterator().next() String account = (String) super.getAvailablePrincipal(principals);List roles = new ArrayList(); List permissions = new ArrayList();/从数据库中获取当前登录用户的详细信息 User user = userService.getByAccount(account);if(user!= null)/实体类User中包含有用户角色的实体类信息 if(user.getRoles() != null & user.getRoles().size() 0) /获取当前登录用户的角色for(Role role : user.getRoles() roles.add(role.getName();/实体类Role中包含有角色权限的实体类信息 if(role.getPmss() != null & role.getPmss().size() 0) /获取权限 for(Permissi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论