java如何使用shiro
使用 Apache Shiro 进行 Java 应用安全控制
Apache Shiro 是一个强大且易用的 Java 安全框架,用于身份验证、授权、加密和会话管理。以下是集成 Shiro 到 Java 应用的主要步骤:
添加 Shiro 依赖
在 Maven 项目中,添加以下依赖到 pom.xml:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.12.0</version>
</dependency>
配置 Shiro 安全管理器
创建 shiro.ini 配置文件(或通过代码配置),定义用户、角色和权限:
[users]
admin = password, admin
user = password, user
[roles]
admin = *
user = read:*
在 Java 代码中初始化 SecurityManager:
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
实现身份验证
通过 Subject 进行用户登录验证:
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("admin", "password");
try {
currentUser.login(token); // 登录验证
System.out.println("登录成功");
} catch (AuthenticationException e) {
System.out.println("登录失败: " + e.getMessage());
}
授权检查
检查用户权限或角色:
if (currentUser.hasRole("admin")) {
System.out.println("拥有 admin 角色");
}
if (currentUser.isPermitted("read:data")) {
System.out.println("拥有 read:data 权限");
}
集成到 Web 应用
在 web.xml 中配置 Shiro 过滤器:
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在 shiro.ini 中定义 URL 权限规则:
[urls]
/login = anon
/admin/ = authc, roles[admin]
/user/ = authc, roles[user]
自定义 Realm
扩展 AuthorizingRealm 实现自定义数据源(如数据库):
public class CustomRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRole("admin"); // 从数据库加载角色
info.addStringPermission("read:data"); // 从数据库加载权限
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
// 验证用户名和密码(如查询数据库)
return new SimpleAuthenticationInfo(username, password, getName());
}
}
注册自定义 Realm 到 SecurityManager:
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(new CustomRealm());
SecurityUtils.setSecurityManager(securityManager);
会话管理
Shiro 提供统一的会话 API,支持 Web 和非 Web 环境:

Session session = currentUser.getSession();
session.setAttribute("key", "value");
String value = (String) session.getAttribute("key");
通过以上步骤,可以快速集成 Shiro 实现 Java 应用的安全控制。根据需求扩展 Realm 或配置更复杂的权限规则。






