1、新建maven项目,引入shiro的核心依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.1</version>
</dependency>
2、在resource下新建shiro.ini
#定义用户
[users]
#用户名=密码,角色。一个用户可以对应多个角色,比如同时是绿钻、黄钻
chy1 = abcd, common
chy2 = abcd, vip
chy3 = abcd, svip
#定义角色
[roles]
#角色=权限。可以有多个权限,逗号分隔
common = watch
vip = watch,download
svip = *
3、新建实体类User
public class User {
private String name;
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = 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;
}
}
4、新建工具列UserShiro
public class UserShiro {
/**
* 指定SecurityManager、Realm,将User包装为Subject
* @param user 用户
* @return Subject shiro的认证、授权操作都要先将User包装为Subject,通过Subject来操作
*/
public static Subject getSubject(User user) {
//配置SecurityManager。IniSecurityManagerFactory过时了,使用DefaultSecurityManager代替
DefaultSecurityManager securityManager = new DefaultSecurityManager();
//.ini文件方式实现的Realm
IniRealm realm = new IniRealm("classpath:shiro.ini");
securityManager.setRealm(realm);
//指定要使用的SecurityManager
SecurityUtils.setSecurityManager(securityManager);
//获取Subject对象
Subject subject = SecurityUtils.getSubject();
return subject;
}
/**
* 检查用户是否是指定角色,比如student、teacher、guest,common、vip、svip等
* @param user 用户
* @param role 角色
* @return boolean 该用户是否是指定的角色
*/
public static boolean hasRole(User user, String role) {
Subject subject = getSubject(user);
return subject.hasRole(role);
}
/**
* 获取用户对应的角色。比如百度网盘登录时在头像处要显示用户的身份标识
* @param user
* @return String 用户对应的角色
*/
public static String getRole(User user){
Subject subject = getSubject(user);
String[] allRole = {"common", "vip", "svip"};
//如果用户同时具有多个角色,比如同时是绿钻、黄钻,可以放在数组、集合中返回
String role=null;
for (String ele:allRole){
if (subject.hasRole(ele)){
role = ele;
break;
}
}
return role;
}
/**
检查用户是否具有某项权限、可以执行某项操作,比如下载文件、极速下载
* @param user 用户信息
* @param permit 要检查的权限
* @return boolean 该用户是否具有指定的权限
*/
public static boolean isPermitted(User user, String permit) {
Subject subject = getSubject(user);
return subject.isPermitted(permit);
}
/**
* 登录检查
* @param user 用户登录信息
* @return boolean 登录结果,是否匹配
*/
public static boolean login(User user) {
Subject subject= getSubject(user);
//通token封装用户信息
UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword());
try {
//将token与Realm中的信息进行对比。这个方法的返回值是void,如果找不到匹配,直接抛出异常
subject.login(token);
} catch (AuthenticationException e1) {
//Realm中没有匹配的用户
return false;
}
return true;
}
/**
* 登出
*/
public static void logout(User user){
Subject subject = getSubject(user);
subject.logout();
}
}
5、新建测试类Test
public class Test {
public static void main(String[] args) {
User user = new User("chy3", "abcd");
if ( UserShiro.login(user) ){
System.out.println("登录成功");
System.out.println("您的身份是:" + UserShiro.getRole(user));
}
else {
System.out.println("用户名或密码错误");
}
}
}
6、运行,效果如下