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~