Shiro是一个强大且易于使用的Java安全框架,它提供了身份验证、授权、会话管理和加密等功能。对于初学者来说,Shiro的学习和配置可能会感到有些复杂。本文将带你从入门到实战,轻松学会Shiro框架的集成与安全配置。
一、Shiro简介
Shiro是一个Java安全框架,旨在提供易于使用且功能强大的安全支持。它主要分为以下几个模块:
- Authentication(认证):用于用户登录验证。
- Authorization(授权):用于用户权限验证。
- Session Management(会话管理):用于用户会话管理。
- Cryptography(加密):用于数据加密。
二、Shiro环境搭建
1. 确定Java版本
Shiro支持Java 7及以上版本。确保你的开发环境已经安装了对应版本的Java。
2. 创建Maven项目
使用Maven创建一个Java项目,并添加Shiro依赖。
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
3. 添加Shiro配置
在src/main/resources目录下创建一个名为shiro.ini的配置文件。
[main]
# 配置核心安全管理和核心 realms
# 定义了一个名为 main 的 realm,它指向了 MyRealm 类
main = org.apache.shiro.realm.text.TextRealm
# 配置了用户名和密码
[users]
root = password, root
三、Shiro集成与安全配置
1. 创建自定义Realm
创建一个继承自AuthorizingRealm的自定义Realm,用于处理认证和授权。
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 根据用户名从数据库获取用户信息
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
// 验证用户名和密码
if ("root".equals(username) && "password".equals(password)) {
return new SimpleAuthenticationInfo(username, password, getName());
} else {
throw new AuthenticationException("用户名或密码错误!");
}
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 根据用户名从数据库获取用户权限
if ("root".equals(username)) {
info.addRole("admin");
info.addStringPermission("user:create");
info.addStringPermission("user:delete");
}
return info;
}
}
2. 配置Spring集成
在Spring配置文件中配置Shiro。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置Shiro核心安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
</bean>
<!-- 配置Shiro过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!-- 配置过滤器规则 -->
<property name="filterChainDefinitions">
<value>
/login = anon
/logout = logout
/** = authc
</value>
</property>
</bean>
<!-- 开启Shiro注解支持 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
</beans>
3. 集成Shiro过滤器
在Web.xml中配置Shiro过滤器。
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.apache.shiro.web.filter.SecurityFilter</filter-class>
<init-param>
<param-name>loginUrl</param-name>
<param-value>/login</param-value>
</init-param>
<init-param>
<param-name>unauthorizedUrl</param-name>
<param-value>/unauthorized</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. 使用Shiro标签
在JSP页面中使用Shiro标签进行页面控制。
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags-shiro" %>
<!DOCTYPE html>
<html>
<head>
<title>Shiro示例</title>
</head>
<body>
<shiro:hasRole name="admin">
<h1>欢迎,管理员!</h1>
</shiro:hasRole>
<shiro:hasPermission name="user:create">
<h1>您有创建用户的权限</h1>
</shiro:hasPermission>
</body>
</html>
四、总结
通过本文的学习,你现在已经掌握了Shiro框架的集成与安全配置。在实际开发中,Shiro可以与Spring、SpringMVC等框架进行集成,实现强大的安全功能。希望本文对你有所帮助!
