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、运行,效果如下
登录成功 您的身份是:svip
来源:https://www.cnblogs.com/chy18883701161/p/12596297.html