Shiro教程⼋步曲(⼀)Shiro⼊门,⼩⽩菜鸟,也能看懂学会!Shiro⼊门
Shiro 是当下常见的安全框架,主要⽤于⽤户验证和授权操作。
Shiro 有相当的复杂性,为了使得学习更加平滑,本系列教程按照如下节奏系统地,循序渐进地,难度平滑提⾼地展开
在使⽤Shiro 之前,⼤家做登录,权限什么的都是五花⼋门,各种花⾥胡哨的代码,不同系统的做法很有可能千差万别。
但是使⽤ Shiro 这个安全框架之后,⼤家做权限的⽅式都⼀致化了,这样的好处就是你的代码我看起来容易,我的代码你也好理解。Shiro 也⽐较成熟,基本上能满⾜⼤部分的权限需要。
下⾯开始进⼊正题:
先来个最简单的,两下就跑起来的基于ini配置⽂件的
本教程源码下载:
步骤⼀:
在src⽬录下新建 shiro.ini
这⾥⾯定义了和安全相关的数据: ⽤户,⾓⾊和权限
注释很详细了,挨个看就能理解了
#定义⽤户
[users]
#⽤户名 zhang3 密码是12345,⾓⾊是 admin
zhang3 =12345, admin
#⽤户名 li4 密码是 abcde,⾓⾊是产品经理
li4 = abcde,productManager
#定义⾓⾊
[roles]
#管理员什么都能做
admin =*
#产品经理只能做产品管理
productManager = addProduct,deleteProduct,editProduct,updateProduct,listProduct
#订单经理只能做订单管理
orderManager = addOrder,deleteOrder,editOrder,updateOrder,listOrder
步骤⼆:
准备⽤户类,⽤于存放账号密码
package com.how2java;
public class User {
private String name;
private String password;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}
}
步骤三:
准备3个⽤户,前两个能在 shiro.ini 中到,第3个不存在
然后测试登录
接着测试是否包含⾓⾊
最后测试是否拥有权限
注:Subject 在 Shiro 这个安全框架下, Subject 就是当前⽤户
package com.how2java;
import java.util.ArrayList;
import java.util.List;
shiro安全框架import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.fig.IniSecurityManagerFactory;
import org.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class TestShiro {
public static void main(String[] args){
//⽤户们
User zhang3 =new User();
zhang3.setName("zhang3");
zhang3.setPassword("12345");
User li4 =new User();
li4.setName("li4");
li4.setPassword("abcde");
User wang5 =new User();
wang5.setName("wang5");
wang5.setPassword("wrongpassword");
List<User> users =new ArrayList<>();
users.add(zhang3);
users.add(li4);
users.add(wang5);
//⾓⾊们
String roleAdmin ="admin";
String roleProductManager ="productManager";
List<String> roles =new ArrayList<>();
roles.add(roleAdmin);
roles.add(roleProductManager);
//权限们
String permitAddProduct ="addProduct";
String permitAddOrder ="addOrder";
List<String> permits =new ArrayList<>();
permits.add(permitAddProduct);
permits.add(permitAddOrder);
//登陆每个⽤户
for(User user : users){
if(login(user))
System.out.printf("%s \t成功登陆,⽤的密码是 %s\t %n",Name(),Password());
else
System.out.printf("%s \t成功失败,⽤的密码是 %s\t %n",Name(),Password());
}
System.out.println("-------how2j 分割线------");
System.out.println("-------how2j 分割线------");
//判断能够登录的⽤户是否拥有某个⾓⾊
for(User user : users){
for(String role : roles){
if(login(user)){
if(hasRole(user, role))
System.out.printf("%s\t 拥有⾓⾊: %s\t%n",Name(),role);
else
System.out.printf("%s\t 不拥有⾓⾊: %s\t%n",Name(),role);
}
}
}
System.out.println("-------how2j 分割线------");
//判断能够登录的⽤户,是否拥有某种权限
for(User user : users){
for(String permit : permits){
if(login(user)){
if(isPermitted(user, permit))
System.out.printf("%s\t 拥有权限: %s\t%n",Name(),permit);
else
System.out.printf("%s\t 不拥有权限: %s\t%n",Name(),permit);
}
}
}
}
private static boolean hasRole(User user, String role){
Subject subject =getSubject(user);
return subject.hasRole(role);
}
private static boolean isPermitted(User user, String permit){
Subject subject =getSubject(user);
return subject.isPermitted(permit);
}
private static Subject getSubject(User user){
//加载配置⽂件,并获取⼯⼚
Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");
//获取安全管理者实例
SecurityManager sm = Instance();
//将安全管理者放⼊全局对象
SecurityUtils.setSecurityManager(sm);
//全局对象通过安全管理者⽣成Subject对象
Subject subject = Subject();
return subject;
}
private static boolean login(User user){
Subject subject=getSubject(user);
//如果已经登录过了,退出
if(subject.isAuthenticated())
subject.logout();
//封装⽤户的数据
UsernamePasswordToken token =new Name(), Password());
try{
//将⽤户的数据token 最终传递到Realm中进⾏对⽐
subject.login(token);
}catch(AuthenticationException e){
//验证错误
return false;
}
}
return subject.isAuthenticated();
}
}
步骤四:
运⾏ TestShiro,可以观察到如图所⽰的效果
某个⽤户是否登陆成功
某个⽤户是否拥有某个⾓⾊
某个⽤户是否拥有某种权限
总结:
在教程⾥,账号密码,⾓⾊信息都是放在配置⽂件⾥的,真实⼯作的时候,肯定都是放在数据库⾥的。所以接下来就会讲解如何配合数据库⼯作 :
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论