Shiro是一个开源的安全框架,用于实现身份验证、授权、会话管理和加密等功能。在Java开发中,Shiro因其简单易用、功能强大而受到广泛欢迎。本文将深入探讨如何使用Shiro框架搭建一个高效的菜单管理系统。
一、Shiro框架简介
Shiro框架的核心组件包括:
- Subject:当前登录的用户。
- SecurityManager:Shiro的核心安全管理器,负责管理内部组件。
- Realm:用于身份验证和授权。
- SessionManager:会话管理器。
- CacheManager:缓存管理器,用于存储认证和授权信息。
二、搭建菜单管理系统
1. 环境准备
首先,确保你的开发环境已经安装了以下软件:
- Java开发工具包(JDK)
- Maven或Gradle构建工具
- Web服务器(如Tomcat)
2. 创建项目
使用Maven或Gradle创建一个Java Web项目。以下是一个简单的Maven项目结构示例:
my-menu-system
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── mymenusystem
│ │ │ ├── controller
│ │ │ ├── model
│ │ │ ├── service
│ │ │ └── utils
│ │ └── resources
│ │ └── application.properties
└── pom.xml
3. 添加Shiro依赖
在pom.xml文件中添加Shiro依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.8.0</version>
</dependency>
4. 配置Shiro
在application.properties文件中配置Shiro:
shiro.loginUrl=/login.html
shiro.unauthorizedUrl=/unauthorized.html
shiro.session.cookie.name=shiro_session_id
shiro.session.cookie.maxAge=-1
5. 创建用户和角色
在Realm中创建用户和角色信息:
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());
// 根据用户名查询数据库,获取用户信息和角色信息
// ...
return new SimpleAuthenticationInfo(user, password, getName());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) SecurityUtils.getSubject().getPrincipal();
// 根据用户名查询数据库,获取角色信息
// ...
return new SimpleAuthorizationInfo();
}
}
6. 登录和权限控制
在控制器中实现登录和权限控制:
@Controller
public class LoginController {
@RequestMapping("/login")
public String login() {
return "login";
}
@RequestMapping("/doLogin")
public String doLogin(@RequestParam("username") String username,
@RequestParam("password") String password) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
SecurityUtils.getSubject().login(token);
return "redirect:/index";
} catch (AuthenticationException e) {
return "redirect:/login?error";
}
}
@RequestMapping("/unauthorized")
public String unauthorized() {
return "unauthorized";
}
}
7. 创建菜单页面
在JSP页面中创建菜单:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>菜单管理</title>
</head>
<body>
<%@ if (SecurityUtils.getSubject().isAuthenticated()) { %>
<ul>
<li><a href="/menu/list">菜单列表</a></li>
<li><a href="/menu/add">添加菜单</a></li>
</ul>
<%@ } else { %>
<a href="/login">登录</a>
<%@ } %>
</body>
</html>
8. 创建菜单列表页面
在JSP页面中展示菜单列表:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>菜单列表</title>
</head>
<body>
<%@ if (SecurityUtils.getSubject().isAuthenticated()) { %>
<table>
<thead>
<tr>
<th>菜单名称</th>
<th>菜单URL</th>
</tr>
</thead>
<tbody>
<c:forEach var="menu" items="${menus}">
<tr>
<td>${menu.name}</td>
<td>${menu.url}</td>
</tr>
</c:forEach>
</tbody>
</table>
<%@ } else { %>
<a href="/login">登录</a>
<%@ } %>
</body>
</html>
三、总结
通过以上步骤,我们使用Shiro框架搭建了一个简单的菜单管理系统。在实际项目中,可以根据需求扩展功能,如增加权限控制、角色管理、用户管理等。Shiro框架为Java开发提供了强大的安全支持,是构建安全系统的理想选择。
