Shiro教程--Authorization 授权及权限验证(四)

 

 

 

权限认证

也就是访问控制,即在应用中控制谁能访问哪些资源。

在权限认证中,最核心的三个要素是:

1-角色role,是权限的集合,一种角色可以被很多个用户拥有,一种角色可以包含多种权限;【多对多】

2-用户user,在 Shiro 中,代表访问系统的用户,被封装成 安全主体Subject对象;

3-权限permission,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的CRUD操作权限;

 

授权

1,编程式授权

 

1.1 基于角色role的访问控制方法

 

掌握has***

了解check***

 

编写Shrio框架的工具类

编写验证程序:

 

 

package com.company.util;

 

import org.apache.shiro.SecurityUtils;

import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authc.UsernamePasswordToken;

import org.apache.shiro.config.IniSecurityManagerFactory;

import org.apache.shiro.mgt.SecurityManager;

import org.apache.shiro.subject.Subject;

 

/**

* Created by Teacher XU on 2017/11/20 0020.

*/

public class ShiroUtils {

//1-读取配置文件,获取身份验证

public static Subject getSubject(String configFile){

//1-创建SecurityManager安全管理器对象,读取shiro配置文件信息

SecurityManager securityManager = new IniSecurityManagerFactory("classpath:"+configFile).getInstance();

SecurityUtils.setSecurityManager(securityManager);//2-配置安全管理工具SecurityUtil

return SecurityUtils.getSubject();//3-返回Subject对象

}

 

//2-读取配置文件,登录验证后,获取身份验证

public static Subject login(String configFile,String username,String password){

Subject authenSubject = getSubject(configFile);

AuthenticationToken userToken = new UsernamePasswordToken(username,password);

try{

authenSubject.login(userToken);

}catch(AuthenticationException ex){

ex.printStackTrace();

}

return authenSubject;

}

}

 

[users]

# 用户名=密码 角色...

 

#scott用户拥有角色1

scott=tiger,role1

 

#root用户拥有角色1,2

root=root,role1,role2

 

#admin用户拥有角色1,2,3

admin=123456,role1,role2,role3

package com.company.shiro;

 

import com.company.util.ShiroUtils;

import org.apache.shiro.subject.Subject;

 

import java.util.Arrays;

import java.util.List;

 

/**

* Created by Teacher XU on 2017/11/20 0020.

*/

public class ShiroAuthorization {

public static void main(String[] args) {

//admin=123456,role1,role2,role3,获取认证身份

Subject currentUser = ShiroUtils.login("authorization_shiro.ini","admin","123456");

System.out.println("principal:"+currentUser.getPrincipal());

 

//判断是否拥有某一个角色

System.out.println("***hasRole***:");

System.out.println("role1:"+currentUser.hasRole("role1"));

 

//遍历集合中的每一个角色,判断用户是否拥有,有返回true,没有返回false,返回值是boolean数组

System.out.println("***hasRoles***");

List<String> roles = Arrays.asList("role1","role3","role4");

boolean[] results = currentUser.hasRoles(roles);

for(int i=0;i<results.length;i++) {

System.out.println(roles.get(i)+":" +results[i]);

}

 

//判断用户是否拥有集合中的所有角色,拥有所有返回true,否则返回false

System.out.println("***hasAllRoles***");

System.out.println("hasAllRoles:"+currentUser.hasAllRoles(Arrays.asList("role2","role3")));

 

currentUser.logout();

}

}

 

1.2 基于权限的访问控制

 

掌握isPermitted***方法

 

 

了解checkPermission***方法

 

 

 

 

 

[users]

#用户名=密码,角色...

scott=tiger,role1

root=root,role2

admin=123456,role3

 

 

[roles]

#角色=权限...

role1=user.findAll,user.findById

role2=user.insert,user.delete,user.update

role3=user.findAll,user.findById,user.insert,user.delete,user.update

package com.company.shiro;

 

import com.company.util.ShiroUtils;

import org.apache.shiro.SecurityUtils;

import org.apache.shiro.subject.Subject;

 

import java.util.Arrays;

 

/**

* Created by Teacher XU on 2017/11/20 0020.

*/

public class ShrioPermission {

public static void main(String[] args) {

Subject authenSubject = ShiroUtils.login("permission_shiro.ini","root","root");

System.out.println("pricipal:"+authenSubject.getPrincipal());

 

System.out.println("***************************");

System.out.println(authenSubject.isPermitted("user.delete")?"has delete permission!":"has no delete permission");

System.out.println(authenSubject.isPermitted("user.findAll")?"has findAll permission!":"has no findAll permission");

 

System.out.println("***************************");

boolean []results = authenSubject.isPermitted("user.findById","user.insert","user.update");

for(boolean result:results) {

System.out.println( result? "has permission!" : "has no permission");

}

 

System.out.println("***************************");

System.out.println(authenSubject.isPermittedAll("user.findAll","user.insert")?"has All permissions!":"has no all permissions");

 

 

}

}

 

2,注解式授权(简单了解)

http://shiro.apache.org/authorization.html#Authorization-AnnotationbasedAuthorization

 

 

@RequiresAuthentication

要求当前 Subject 已经在当前的 session 中被验证通过才能被访问或调用。

@RequiresGuest

要求当前的 Subject 是一个"guest",也就是说,他们必须是在之前的 session 中没有被验证或被记住才能被访问或调用。

@RequiresPermissions("account:create")

要求当前的 Subject 被允许一个或多个权限,以便执行注解的方法。

@RequiresRoles("administrator")

要求当前的 Subject 拥有所有指定的角色。如果他们没有,则该方法将不会被执行,而且 AuthorizationException 异常将会被抛出。

@RequiresUser RequiresUser

注解需要当前的 Subject 是一个应用程序用户才能被注解的类/实例/方法访问或调用。一个“应用程序用户”被定义为一个拥有已知身份,或在当前 session 中由于通过验证被确认,或者在之前 session 中的'RememberMe'服务被记住。

 

3,Jsp 标签授权(简单了解)

http://shiro.apache.org/authorization.html#Authorization-JSPTagLibAuthorization

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

 

Guest 标签:

用户没有身份验证时显示相应信息,即游客访问信息;

User 标签:

用户已经身份验证/记住我登录后显示相应的信息;

Authenticated 标签:

用户已经身份验证通过,即 Subject.login 登录成功,不是记住我登录的。

notAuthenticated 标签:

用户没有身份验证通过,即没有调用 Subject.login 进行登录,包括记住我自动登录

的也属于未进行身份验证。

principal 标签:

显示用户身份信息,默认调用 Subject.getPrincipal()获取,即 Primary Principal。

hasRole 标签:

如果当前 Subject 有角色将显示 body 体内容。

lacksRole 标签:

如果当前 Subject 没有角色将显示 body 体内容。

hasAnyRoles 标签:

如果当前 Subject 有任意一个角色(或的关系)将显示 body 体内容。

hasPermission 标签:

如果当前 Subject 有权限将显示 body 体内容。

lacksPermission 标签:

如果当前 Subject 没有权限将显示 body 体内容。

 

4,Permissions权限的定义方式 (掌握)

 

单个权限 query

单个资源多个权限 user:query user:add --- 多值 user:query,add

单个资源所有权限 user:query,add,update,delete --- user:*

所有资源某个权限 *:view

 

实例级别的权限控制(两台打印机lp7200,epsoncolor,分别有查询query和print的功能)

 

单个实例的单个权限 printer:query:lp7200,printer:print:epsoncolor

所有实例的单个权限 printer:print:*

所有实例的所有权限 printer:*:*

单个实例的所有权限 printer:*:lp7200

单个实例的多个权限 printer:query,print:lp7200

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油炸小波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值