Java学习笔记每天写1000字每天写500字

shiro授权:链接数据库doGetAuthorizationI

2019-06-22  本文已影响2人  您好简书

7.2 授权方式
Shiro 支持三种方式的授权:
 编程式:通过写if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
 注解式:通过在执行的Java方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello() {
//有权限
}
 JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>

本教程序授权测试使用第一种编程方式,实际与web系统集成使用后两种方式。

1.1.1 需求

修改realm的doGetAuthorizationInfo,从数据库查询权限信息。

使用注解式授权方法。

使用jsp标签授权方法。

1.1.2 修改doGetAuthorizationInfo从数据库查询权限

// 用于授权

  @Override

  **protected** AuthorizationInfo doGetAuthorizationInfo(

 PrincipalCollection principals) {

  //从 principals获取主身份信息

  //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),

 ActiveUser activeUser = (ActiveUser) principals.getPrimaryPrincipal();

  //根据身份信息获取权限信息

  //从数据库获取到权限数据

 List<SysPermission> permissionList = **null**;

  **try** {

 permissionList = sysService.findPermissionListByUserId(activeUser.getUserid());

 } **catch** (Exception e) {

  // **TODO** Auto-generated catch block

 e.printStackTrace();

 }

  //单独定一个集合对象

 List<String> permissions = **new** ArrayList<String>();

  **if**(permissionList!=**null**){

  **for**(SysPermission sysPermission:permissionList){

  //将数据库中的权限标签  符放入集合

 permissions.add(sysPermission.getPercode());

 }

 }

  //查到权限数据,返回授权信息(要包括  上边的permissions)

 SimpleAuthorizationInfo simpleAuthorizationInfo = **new** SimpleAuthorizationInfo();

  //将上边查询到授权信息填充到simpleAuthorizationInfo对象中

 simpleAuthorizationInfo.addStringPermissions(permissions);

  **return** simpleAuthorizationInfo;

 }

1.1.3 开启controller类aop支持

对系统中类的方法给用户授权,建议在controller层进行方法授权。

在springmvc.xml中配置:

image.png

1.1.4 在controller方法中添加注解

image.png

1.1.5 jsp标签 授权

Jsp页面添加:

<%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %>

标签名称 标签条件(均是显示标签内容)
<shiro:authenticated> 登录之后
<shiro:notAuthenticated> 不在登录状态时
<shiro:guest> 用户在没有RememberMe时
<shiro:user> 用户在RememberMe时
<shiro:hasAnyRoles name="abc,123" > 在有abc或者123角色时
<shiro:hasRole name="abc"> 拥有角色abc
<shiro:lacksRole name="abc"> 没有角色abc
<shiro:hasPermission name="abc"> 拥有权限资源abc
<shiro:lacksPermission name="abc"> 没有abc权限资源
<shiro:principal> 显示用户身份名称
<shiro:principal property="username"/> 显示用户身份中的属性值
修改itemsList.jsp页面:


image.png

1.1.6 授权测试

当调用controller的一个方法,由于该 方法加了@RequiresPermissions("item:query") ,shiro调用realm获取数据库中的权限信息,看"item:query"是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。

当展示一个jsp页面时,页面中如果遇到<shiro:hasPermission name="item:update">,shiro调用realm获取数据库中的权限信息,看item:update是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。

问题:只要遇到注解或jsp标签的授权,都会调用realm方法查询数据库,需要使用缓存解决此问题。

上一篇 下一篇

猜你喜欢

热点阅读