java shiro认证以及授权


1.认证部分

认证流程

1.1  创建java工程

jdk版本:1.7.0_72
eclipse:elipse-indigo

1.2 加入shiro-core的Jar包及依赖包


1.3在项目下创建config 包,然后添加log4j.properties日志配置文件以及shiro.ini 文件

log4j 文件内容

log4j.rootLogger=debug, stdout
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
shiro.ini 文件
[users]
zhang=123
lisi=123

1.4认证的代码

public class AuthenticationTest {

	@Test
	public void testLoginAndLogOut()
	{
		// 构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境
		Factory<org.apache.shiro.mgt.SecurityManager> factoty  = new IniSecurityManagerFactory("classpath:shiro.ini");
	
		// 通过工厂创建SecurityManager
		SecurityManager securityManager = factoty.getInstance();
		
		// 将securityManager设置到运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		// 创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
		Subject subject = SecurityUtils.getSubject();
		
		// 创建token令牌,记录用户认证的身份和凭证即账号和密码 
		UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
		
		try {
			subject.login(token);
		} catch (AuthenticationException e) {
			e.printStackTrace();
		}
		boolean authenticated = subject.isAuthenticated();
		
		System.out.println("用户认证状态"+authenticated);

		subject.logout();
		
		authenticated = subject.isAuthenticated();
		
		System.out.println("用户认证状态"+authenticated);
	}
	
}

1.5 认证执行流程

 
    
1、  创建token令牌,token中有用户提交的认证信息即账号和密码
2、  执行subject.login(token),最终由securityManager通过Authenticator进行认证

3、 Authenticator的实现ModularRealmAuthenticator   调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带) 4、  IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

2:授权部分


Shiro 支持三种方式的授权:

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

2.1 在config目录下创建shior-permission.ini文件,文件内容为:

[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=123,role2
[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create
在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2...” “角色=权限1,权限2...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合

2.2  权限字符串规则

权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
例子:
用户创建权限:user:create,或user:create:*
用户修改实例001的权限:user:update:001
用户实例001的所有权限:user:*:001

2.3 测试代码

@Test
	public void testPermission() {

		// 从ini文件中创建SecurityManager工厂
		Factory<SecurityManager> factory = new IniSecurityManagerFactory(
				"classpath:shiro-permission.ini");

		// 创建SecurityManager
		SecurityManager securityManager = factory.getInstance();

		// 将securityManager设置到运行环境
		SecurityUtils.setSecurityManager(securityManager);

		// 创建主体对象
		Subject subject = SecurityUtils.getSubject();

		// 对主体对象进行认证
		// 用户登陆
		// 设置用户认证的身份(principals)和凭证(credentials)
		UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
		try {
			subject.login(token);
		} catch (AuthenticationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// 用户认证状态
		Boolean isAuthenticated = subject.isAuthenticated();

		System.out.println("用户认证状态:" + isAuthenticated);

		// 用户授权检测 基于角色授权
		// 是否有某一个角色
		System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));
		// 是否有多个角色
		System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));
		
//		subject.checkRole("role1");
//		subject.checkRoles(Arrays.asList("role1", "role2"));

		// 授权检测,失败则抛出异常
		// subject.checkRole("role22");

		// 基于资源授权
		System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
		System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1",	"user:delete"));
		
		//检查权限
		subject.checkPermission("sys:user:delete");
		subject.checkPermissions("user:create:1","user:delete");
		
	

2.4 基于角色的授权

// 用户授权检测 基于角色授权
		// 是否有某一个角色
		System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));
		// 是否有多个角色
		System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));
		
对应的check方法:
subject.checkRole("role1");
subject.checkRoles(Arrays.asList("role1", "role2"));

2.5 基于资源授权

// 基于资源授权
		System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
		System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1",	"user:delete"));
对应的check方法:
subject.checkPermission("sys:user:delete");
subject.checkPermissions("user:create:1","user:delete");

上边check方法如果授权失败则抛出异常:
org.apache.shiro.authz.UnauthorizedException:Subject does not have permission [....]

相关源码下载:http://download.csdn.net/detail/u012014505/9627098


猜你喜欢

转载自blog.csdn.net/u012014505/article/details/52493733