shiro第三课

来源:互联网 发布:erp软件排名 编辑:程序博客网 时间:2024/05/31 04:04

权限认证核心要素

权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;
用户,在Shiro 中,代表访问系统的用户,即Subject;


授权

1,编程式授权
1.1 基于角色的访问控制

-------------------------------认证公共类

public class ShiroUtil {
public static Subject login(String configFile, String userName, String password) {
// 读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
// 获取securityManager实例
SecurityManager securityManager = factory.getInstance();
// 把securityManager实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
// 得到当前执行的用户
Subject currentUser = SecurityUtils.getSubject();
// 创建token令牌,用户名/密码
UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
try {
// 身份认证
currentUser.login(token);
System.out.println("身份认证成功!");
} catch (AuthenticationException e) {
//e.printStackTrace();
System.out.println("身份认证失败!");
}
return currentUser;
}
}

----------------------------------shiro_role.ini 文件


[users]
java=123456,role1,role2
dt=123,role1

-----------------------------test类

@Test
public void test(){
Subject subject = ShiroUtil.login("classpath:shiro_role.ini", "java", "123456");
System.out.println(subject.hasRole("role1")?"有":"没有");
boolean[] result =  subject.hasRoles(Arrays.asList("role1","role2","role3"));
System.out.println(result[0]);
System.out.println(result[1]);
System.out.println(result[2]);
}



1.2 基于权限的访问控制

-------------------------------shiro_permission.ini  文件

[users]
java1234=123456,role1,role2
jack=123,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete


----------------------------------test

@Test
public void testIsPermitted() {
Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java", "123456");
// Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
System.out.println(currentUser.isPermitted("user:select")?"有user:select这个权限":"没有user:select这个权限");
System.out.println(currentUser.isPermitted("user:update")?"有user:update这个权限":"没有user:update这个权限");
boolean results[]=currentUser.isPermitted("user:select","user:update","user:delete");
System.out.println(results[0]?"有user:select这个权限":"没有user:select这个权限");
System.out.println(results[1]?"有user:update这个权限":"没有user:update这个权限");
System.out.println(results[2]?"有user:delete这个权限":"没有user:delete这个权限");
System.out.println(currentUser.isPermittedAll("user:select","user:update")?"有user:select,update这两个权限":"user:select,update这两个权限不全有");

currentUser.logout();
}





2,注解式授权

@RequiresAuthentication 要求当前Subject 已经在当前的session 中被验证通过才能被访问或调用。
@RequiresGuest 要求当前的Subject 是一个"guest",也就是说,他们必须是在之前的session 中没有被验证或被记住才
能被访问或调用。
@RequiresPermissions("account:create") 要求当前的Subject 被允许一个或多个权限,以便执行注解的方法。
@RequiresRoles("administrator") 要求当前的Subject 拥有所有指定的角色。如果他们没有,则该方法将不会被执行,而
且AuthorizationException 异常将会被抛出。
@RequiresUser RequiresUser 注解需要当前的Subject 是一个应用程序用户才能被注解的类/实例/方法访问或调用。一个“应
用程序用户”被定义为一个拥有已知身份,或在当前session 中由于通过验证被确认,或者在之前session 中的'RememberMe'
服务被记住。




3,Jsp 标签授权

<%@ 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 体内容。

0 0
原创粉丝点击