引言
Shiro是一个强大的Java安全框架,提供了身份验证、授权、会话管理和加密等功能。在企业级应用中,搭建一个高效的菜单权限管理系统对于保障系统安全性和用户体验至关重要。本文将详细介绍如何利用Shiro框架轻松搭建一个企业级菜单权限管理系统。
一、Shiro框架概述
Shiro框架的核心组件包括:
- Subject:当前登录的用户。
- SecurityManager:Shiro的核心,负责管理内部组件。
- Realm:负责与数据源进行交互,获取认证信息和权限信息。
- SessionManager:负责会话管理。
- Authentication:身份验证。
- Authorization:授权。
二、搭建环境
- Java环境:确保你的开发环境已安装Java。
- Maven或Gradle:用于依赖管理。
- 数据库:本文以MySQL为例。
三、创建项目
- 新建Maven或Gradle项目。
- 添加依赖:
<!-- Maven依赖 -->
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>
- 配置数据库:在
application.properties或application.yml中配置数据库连接信息。
四、实现功能
1. 用户认证
- 创建User实体类:
public class User {
private Long id;
private String username;
private String password;
// getter和setter方法
}
- 创建UserRealm类:
public class UserRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
User user = userService.getUserByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
}
}
- 配置Shiro:
@Configuration
public class ShiroConfig {
@Bean
public SecurityManager securityManager() {
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(userRealm());
return securityManager;
}
@Bean
public UserRealm userRealm() {
return new UserRealm();
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
// 配置过滤规则
return shiroFilter;
}
}
2. 菜单权限管理
- 创建Menu实体类:
public class Menu {
private Long id;
private String name;
private String url;
private Long parentId;
// getter和setter方法
}
- 创建MenuRealm类:
public class MenuRealm extends AuthorizingRealm {
@Autowired
private MenuService menuService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
User user = (User) principals.getPrimaryPrincipal();
List<Menu> menus = menuService.getMenusByUserId(user.getId());
Set<String> permissions = new HashSet<>();
for (Menu menu : menus) {
permissions.add(menu.getUrl());
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setStringPermissions(permissions);
return info;
}
}
- 配置Shiro:
@Configuration
public class ShiroConfig {
// ... 其他配置 ...
@Bean
public MenuRealm menuRealm() {
return new MenuRealm();
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
// 配置过滤规则
return shiroFilter;
}
}
3. 登录功能
- 创建登录页面。
- 创建LoginController类:
@Controller
public class LoginController {
@Autowired
private UserService userService;
@PostMapping("/login")
public String login(String username, String password, Model model) {
User user = userService.getUserByUsername(username);
if (user != null && user.getPassword().equals(password)) {
// 登录成功,跳转到首页
return "index";
} else {
// 登录失败,返回登录页面
model.addAttribute("error", "用户名或密码错误");
return "login";
}
}
}
4. 菜单展示
- 创建MenuController类:
@Controller
public class MenuController {
@Autowired
private MenuService menuService;
@GetMapping("/menu")
public List<Menu> getMenus() {
return menuService.getMenus();
}
}
- 创建菜单展示页面。
五、总结
通过以上步骤,我们已经成功搭建了一个基于Shiro框架的企业级菜单权限管理系统。在实际应用中,可以根据需求进一步完善和优化系统功能。希望本文对你有所帮助!
