Shiro 是一个强大且易用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能,可以相对简单地集成到你的应用中,并提供了灵活的配置选项。在 Spring Boot 应用中使用 Shiro,可以提供全面的安全保护,并为开发人员提供便利的开发体验。
Shiro 包含以下核心概念:
在 Spring Boot 应用中引入 Shiro,可以使用 Maven,添加以下依赖即可:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.5.3</version>
</dependency>
在 Spring Boot 应用中配置 Shiro,可以在 application.yml 文件中添加如下配置:
shiro:
enabled: true
loginUrl: /login
successUrl: /home
unauthorizedUrl: /403
filterChainDefinitions: /logout=logout
enabled
:是否启用 Shiro,开发阶段可用 false 禁用,生产环境中应该为 trueloginUrl
:登录 URL,请求该 URL 时会跳转到登录页面successUrl
:登录成功 URL,跳转到该 URL 后会显示登录成功消息unauthorizedUrl
:未授权 URL,访问需要授权资源时,会跳转到该 URLfilterChainDefinitions
:URL 映射规则,格式为 URL=拦截器名称,多个规则用逗号分隔Shiro 认证是指验证用户的身份信息,核心类是 org.apache.shiro.authc.AuthenticationToken
接口实现类 org.apache.shiro.authc.UsernamePasswordToken
。在实际应用中,可以通过编写自己的 Realm
类实现多种不同的身份验证方式。以下是一个通过数据库验证用户身份的示例:
public class JdbcRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 角色授权和权限授权
// TODO:
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
}
}
doGetAuthenticationInfo
方法中,我们从 AuthenticationToken
中获取用户名,然后根据该用户名从数据库中查询用户信息,如果用户不存在,就抛出 UnknownAccountException
异常,否则返回一个 SimpleAuthenticationInfo
对象,表示成功验证用户身份。Shiro 授权是指验证用户是否有访问某个资源的权限,核心类是 org.apache.shiro.authz.Permission
接口及其实现类。除了基于权限的授权之外,Shiro 还支持基于角色的授权,可以将一组权限绑定到角色上,然后将角色分配给用户。以下是一个基于注解的授权示例:
@RestController
@RequestMapping("/api/v1")
public class UserController {
@GetMapping("/user/{id}")
@RequiresPermissions("user:view")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
@RequiresPermissions
注解,指定该方法需要 user:view
权限,如果当前用户没有该权限,访问该方法时就会抛出 UnauthorizedException
异常。Shiro 是一个优秀的 Java 安全框架,可以让我们方便地实现身份验证和授权。在 Spring Boot 应用中使用 Shiro,可以帮助我们快速构建安全的 Restful API,提高开发效率。
本文链接:http://task.lmcjl.com/news/7997.html