Shiro验证框架

shiro是什么

在使用Shiro 之前,大家做登录,权限什么的都是五花八门,各种花里胡哨的代码,不同系统的做法很有可能千差万别。
但是使用 Shiro 这个安全框架之后,大家做权限的方式都一致化了,这样的好处就是你的代码我看起来容易,我的代码你也好理解。
Shiro 也比较成熟,基本上能满足大部分的权限需要。

运行效果

在这里插入图片描述

Jar包支持

我这里使用的是shiro-all-1.3.2,slf4j-api-1.7.24

在这里插入图片描述

配置shiro.ini 文件

在src目录下新建 shiro.ini

#用户名,密码,角色
[users]
zhang3 = 12345, admin 
li4 = abcde,productManager
#角色:管理员有所有权限,产品经理只能做产品管理
[roles]
admin = *
productManager = 
addProduct,deleteProduct,editProduct,updateProduct,listProduct

User类

public class User {
	
	private String name;
	private String password;
	//省略getter、setter方法及构造函数
	}

测试

准备3个用户,前两个能在 shiro.ini 中找到,第3个不存在

		//添加用户到List集合
		List<User> users = new ArrayList<>();
    	User zhang3 = new User("zhang3","12345");
    	User li4 = new User("li4","abcde");
    	User wang5 = new User("wang5","wrongpassword");
    	users.add(zhang3);
    	users.add(li4);
    	users.add(wang5); 

准备两个角色:admain 、productManager

		//添加角色到List集合
    	List<String> roles = new ArrayList<>();
    	String roleAdmin = "admin";
    	String roleProductManager ="productManager";
    	roles.add(roleAdmin);
    	roles.add(roleProductManager);

准备两个权限addProduct、addOrder

		//添加权限到List集合
    	List<String> permits = new ArrayList<>();
    	String permitAddProduct = "addProduct";
    	String permitAddOrder = "addOrder";
    	permits.add(permitAddProduct);
    	permits.add(permitAddOrder);

login(User)找出可登录的用户

private static boolean login(User user) {
	Subject subject= getSubject(user);
	//如果已经登录过了,退出
	if(subject.isAuthenticated())
		subject.logout();
		//封装用户的数据
	UsernamePasswordToken token = new UsernamePasswordToken(user.getName(),user.getPassword());
	try {
		//将用户的数据token 最终传递到Realm中进行对比
		subject.login(token);
		} catch (AuthenticationException e) {
		  	//验证错误
			return false;
		}				
		return subject.isAuthenticated();
	}

测试登录

for (User user : users) {
	if(login(user)) 
    	System.out.printf("%s \t成功登陆,用的密码是 %s\t %n",user.getName(),user.getPassword());
    else 
   		System.out.printf("%s \t成功失败,用的密码是 %s\t %n",user.getName(),user.getPassword());
		}

测试能够登录的用户是否包含角色

for (User user : users) {
	for (String role : roles) {
    	if(login(user)) {
	    	if(hasRole(user, role)) 
	    		System.out.printf("%s\t 拥有角色: %s\t%n",user.getName(),role);
	    	else
	    		System.out.printf("%s\t 不拥有角色: %s\t%n",user.getName(),role);
    			}
    		}	
		}

判断能够登录的用户,是否拥有某种权限

//判断能够登录的用户,是否拥有某种权限
for (User user : users) {
	for (String permit : permits) {
		if(login(user)) {
			if(isPermitted(user, permit)) 
				System.out.printf("%s\t 拥有权限: %s\t%n",user.getName(),permit);
			else
				System.out.printf("%s\t 不拥有权限: %s\t%n",user.getName(),permit);
    	}
    }	
}

判断用户是否有roles 中的角色

private static boolean hasRole(User user, String role) {
	Subject subject = getSubject(user);
	//Subject对象调用hasRole方法
	return subject.hasRole(role);
}

判断用户是否有permits 中的权限

private static boolean isPermitted(User user, String permit) {
	Subject subject = getSubject(user);
	//Subject对象调用hasRole方法
	return subject.isPermitted(permit);
}

获取Subject对象,加载shiro.ini文件

//Subject对象理解为一个用户,可以使用验证的用户
private static Subject getSubject(User user) {
	//加载配置文件,并获取工厂
	Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
	//获取安全管理者实例
	SecurityManager sm = factory.getInstance();
	//将安全管理者放入全局对象
	SecurityUtils.setSecurityManager(sm);
	//全局对象通过安全管理者生成Subject对象
	Subject subject = SecurityUtils.getSubject();
	return subject;
}

判断用户是否已登录

private static boolean login(User user) {
	Subject subject= getSubject(user);
	//如果已经登录过了,退出
	if(subject.isAuthenticated())
		subject.logout();
	//封装用户的数据
	UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword());
	try {
		//将用户的数据token 最终传递到Realm中进行对比
		subject.login(token);
	} catch (AuthenticationException e) {
		//验证错误
		return false;
	}				
	return subject.isAuthenticated();
	}

项目资料

shiro源码 密码:lwmi

第一次写帖子,还请大家多多批评指正 ,不吝赐教 O(∩_∩)O~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值