Shiro:Java安全框架的“守护神”,实战解析与应用技巧

一、Shiro简介
Shiro,全称Simple Identity and Role-Based Access Control,是一个开源的安全框架,用于实现用户认证、授权、会话及加密等安全相关功能。Shiro旨在为Java应用提供一个简单、易用、强大的安全解决方案。相较于其他安全框架,Shiro具有以下特点:
1. 简单易用:Shiro采用模块化设计,易于理解和使用。
2. 强大功能:Shiro提供了丰富的安全相关功能,如用户认证、授权、会话管理、加密等。
3. 高度可扩展:Shiro提供多种扩展点,方便用户根据需求进行定制。
二、Shiro核心组件
Shiro框架主要由以下核心组件构成:
1. Subject:主体,即当前用户。
2. SecurityManager:安全管理器,负责管理Subject、Session、权限等。
3. Realm:域,用于封装用户认证和授权逻辑。
4. SessionManager:会话管理器,负责管理Subject的会话。
5. CacheManager:缓存管理器,用于缓存用户认证和授权信息。
6. Cryptography:加密器,用于加密敏感信息。
三、Shiro实战解析
以下以一个简单的示例,演示如何使用Shiro实现用户认证和授权。
1. 添加Shiro依赖
在项目的pom.xml文件中添加以下依赖:
```xml
```
2. 配置Shiro
在项目的web.xml文件中配置Shiro过滤器:
```xml
```
3. 编写Shiro配置类
创建一个Shiro配置类,用于配置Shiro的各个组件:
```java
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager;
import org.apache.shiro.web.filter.mgt.FilterChainManager;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
import org.apache.shiro.web.filter.authz.SslFilter;
import org.apache.shiro.web.filter.authz.UserAuthorizationFilter;
import org.apache.shiro.web.filter.session.SessionFilter;
import org.apache.shiro.web.filter.access.PathMatchingFilterChainResolver;
import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
import org.apache.shiro.web.servlet.ShiroFilterFactoryBean;
public class ShiroConfig {
public static ShiroFilterFactoryBean createShiroFilterFactoryBean() {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(createSecurityManager());
shiroFilterFactoryBean.setLoginUrl("/login.jsp");
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized.jsp");
shiroFilterFactoryBean.setFilterChainDefinitionMap(createFilterChainDefinitionMap());
return shiroFilterFactoryBean;
}
private static SecurityManager createSecurityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(createAuthorizingRealm());
return securityManager;
}
private static AuthorizingRealm createAuthorizingRealm() {
AuthorizingRealm realm = new AuthorizingRealm();
realm.setCredentialsMatcher(new HashedCredentialsMatcher("SHA-256"));
return realm;
}
private static Map
Map
filterChainDefinitionMap.put("/login.jsp", "anon");
filterChainDefinitionMap.put("/unauthorized.jsp", "anon");
filterChainDefinitionMap.put("/**", "authc");
return filterChainDefinitionMap;
}
}
```
4. 编写认证和授权逻辑
在Shiro配置类中,创建AuthorizingRealm类,并实现doGetAuthenticationInfo方法,用于处理用户认证逻辑:
```java
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
public class MyAuthorizingRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
// 查询数据库,验证用户名和密码
if ("admin".equals(username) && "123456".equals(password)) {
return new SimpleAuthenticationInfo(username, password, getName());
} else {
throw new AuthenticationException("用户名或密码错误");
}
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(AuthorizationInfo info) {
String username = info.getPrincipal().toString();
// 查询数据库,获取用户角色和权限
Set
roles.add("admin");
Set
permissions.add("user:create");
permissions.add("user:delete");
info.setRoles(roles);
info.setStringPermissions(permissions);
return info;
}
}
```
5. 使用Shiro进行认证和授权
在需要认证和授权的页面或方法上添加@RequiresAuthentication和@RequiresPermissions注解:
```java
@Controller
public class MyController {
@RequiresAuthentication
@RequiresPermissions("user:create")
@RequestMapping("/createUser")
public String createUser() {
// 创建用户逻辑
return "success";
}
}
```
四、Shiro应用技巧
1. 使用Shiro标签进行权限控制
在JSP页面中,可以使用shiro标签进行权限控制,如:
```jsp
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags/shiro" %>
```
2. 使用Shiro缓存提高性能
Shiro提供了缓存机制,可以缓存用户认证和授权信息,提高系统性能。在Shiro配置类中,配置CacheManager:
```java
public class ShiroConfig {
// ...
private static CacheManager createCacheManager() {
CacheManager cacheManager = new CacheManager();
cacheManager.setCacheManager(new MemoryConcurrentMapCacheManager("shiroCache"));
return cacheManager;
}
// ...
}
```
3. 使用Shiro加密敏感信息
Shiro提供了加密器Cryptography,可以用于加密敏感信息,如用户密码:
```java
import org.apache.shiro.crypto.hash.Sha256Hash;
public class PasswordUtil {
public static String encryptPassword(String password) {
return new Sha256Hash(password).toHex();
}
}
```
五、总结
Shiro是一个简单、易用、强大的Java安全框架,能够帮助开发者快速实现用户认证、授权、会话及加密等安全相关功能。通过本文的实战解析,相信大家对Shiro有了更深入的了解。在实际项目中,可以根据需求灵活运用Shiro提供的各种功能,为Java应用提供强大的安全保障。






