一、什么是Shiro安全框架
shrio是一个强大而灵活的开源安全框架,它主要处理身份验证,授权,会话管理和加密。
-
身份验证:有时称为“登录”,即验证用户的身份。
-
授权:访问控制的过程,即确定“谁”有权访问“什么”。
-
会话管理:即使在非Web或EJB应用程序中,也可以管理用户特定的会话。
-
加密:使用加密算法保持数据安全,同时仍然易于使用。
支持特性:
- Web支持:Shiro的Web支持API有助于开发者轻松保护Web应用程序。
- 缓存:缓存是Apache Shiro API的第一层,可确保安全操作保持快速有效。
- 并发性:Apache Shiro的并发功能支持多线程应用程序。
- 测试:测试支持可帮助您编写单元测试和集成测试,并确保您的代码将按预期进行保护。
- “运行方式”(Run As):允许用户采用其他用户的身份(如果允许),有时在管理方案中很有用。
- “记住我”:在整个会话中记住用户的身份,因此他们仅在必要时登录。
二、编写shiro基本代码
1.引入相关环境
引入shiro-core和slf4j-api相关jar包,shiro使用slf4j记录日志。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
2.创建ini文件
src/main/resources/shiro.ini
# ini文件配置
# -----------------------------------------------------------------------------
# 用户信息格式
# username[用户名] = password[密码], role1[角色1], role2[角色2], ..., role[角色n]
# -----------------------------------------------------------------------------
[users]
root = 123456, admin
guest = 123456, rolea
user1 = 12345, roleb
# -----------------------------------------------------------------------------
# 定义角色相关权限
# roleName[角色名] = perm1[权限范围], perm2, ..., permN
# *类似与通配符,代表当前范围内的任何操作
# -----------------------------------------------------------------------------
[roles]
admin = *
rolea = book:bug
roleb = book:add,book:delete
3.参考程序
package demo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* [用户、角色、权限都是字符串]
*
*
* */
public class Test {
//创建当前类的日志对象
private static final transient Logger log=LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
//创建一个factory,指向ini文件,classpath代表src/main/resourse目录
Factory<SecurityManager> fac=new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager manager=fac.getInstance();
SecurityUtils.setSecurityManager(manager);
log.info("环境初始化完成");
Subject currentUser=SecurityUtils.getSubject();
//System.out.println(currentUser);
Session session=currentUser.getSession();
session.setAttribute("message", "this is shiro");
System.out.println(session.getAttribute("message"));
//当前用户是否已经验证
System.out.println(currentUser.isAuthenticated());
if(currentUser.isAuthenticated()) {
System.out.println("已登录");
}
else {
UsernamePasswordToken token =new UsernamePasswordToken("user1", "12345");
//token.setRememberMe(true);
try {
currentUser.login(token);
System.out.println("登录成功");
} catch (UnknownAccountException e) {
System.out.println("用户不存在");
}catch (IncorrectCredentialsException e) {
System.out.println("密码错误");
}
}
if(currentUser.hasRole("admin")) {
System.out.println("欢迎管理员");
}
if(currentUser.isPermitted("book:bug")) {
System.out.println("允许购买书籍");
}
if(currentUser.isPermitted("book:add")) {
System.out.println("允许增加书籍");
}
if(currentUser.isPermitted("book:delete")) {
System.out.println("允许删除书籍");
}
currentUser.logout();
}
}
辣匕小歆 发布了5 篇原创文章 · 获赞 0 · 访问量 2048 私信 关注