shiro框架举例
时间: 2023-06-28 17:03:42 浏览: 52
Shiro 是一个 Java 安全框架,提供了身份认证、授权、加密等安全功能,可以帮助开发者快速构建安全可靠的应用程序。以下是一个使用 Shiro 框架的简单示例:
1. 引入 Shiro 依赖:
```xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.1</version>
</dependency>
```
2. 配置 Shiro:
```java
// 创建 SecurityManager
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 设置 Realm
securityManager.setRealm(new MyRealm());
// 将 SecurityManager 设置到 SecurityUtils 中
SecurityUtils.setSecurityManager(securityManager);
```
3. 自定义 Realm:
```java
public class MyRealm extends AuthorizingRealm {
// 在 Realm 中实现身份认证逻辑
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 获取用户名和密码
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
// 根据用户名查询用户信息
User user = userRepository.findByUsername(username);
// 判断用户是否存在
if (user == null) {
throw new UnknownAccountException("用户名不存在");
}
// 校验密码
if (!password.equals(user.getPassword())) {
throw new IncorrectCredentialsException("密码错误");
}
// 返回身份认证信息
return new SimpleAuthenticationInfo(user, password, getName());
}
// 在 Realm 中实现授权逻辑
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 获取当前登录用户信息
User user = (User) principals.getPrimaryPrincipal();
// 查询用户角色和权限信息
List<Role> roles = roleRepository.findByUserId(user.getId());
List<Permission> permissions = permissionRepository.findByUserId(user.getId());
// 创建授权信息对象
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 添加角色和权限信息
for (Role role : roles) {
authorizationInfo.addRole(role.getName());
}
for (Permission permission : permissions) {
authorizationInfo.addStringPermission(permission.getName());
}
// 返回授权信息
return authorizationInfo;
}
}
```
4. 在 Controller 中使用 Shiro:
```java
@Controller
public class UserController {
@RequiresAuthentication
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id, Model model) {
// 获取当前登录用户信息
User user = (User) SecurityUtils.getSubject().getPrincipal();
// 判断当前用户是否有查看用户信息的权限
if (!SecurityUtils.getSubject().isPermitted("user:view:" + id)) {
throw new UnauthorizedException("没有权限查看用户信息");
}
// 查询用户信息
User targetUser = userRepository.findById(id);
// 将用户信息放入 Model 中
model.addAttribute("user", targetUser);
// 返回模板页面
return "user";
}
}
```
以上示例演示了如何使用 Shiro 实现身份认证和授权功能,在 Controller 中使用 Shiro 进行权限控制。