shiro整合jwt
时间: 2023-10-06 12:14:12 浏览: 88
SpringBoot-Shiro-JWT:spring boot 结合shiro和jwt技术的实践
在 Shiro 中整合 JWT(JSON Web Token),可以实现基于令牌的身份验证和授权机制。下面是一个简单的示例代码,演示了如何在 Shiro 中使用 JWT:
首先,需要创建一个 JWTRealm 类,继承自 Shiro 的 AuthenticatingRealm 类。在 JWTRealm 中,我们可以通过重写 doGetAuthenticationInfo 和 doGetAuthorizationInfo 方法来实现身份验证和授权逻辑。
```java
public class JWTRealm extends AuthenticatingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
JWTToken jwtToken = (JWTToken) authenticationToken;
String token = jwtToken.getToken();
// 解析 JWT Token,获取用户名
String username = JWTUtil.getUsername(token);
// 根据用户名查询数据库或其他存储,获取用户信息
User user = userService.findByUsername(username);
// 如果用户不存在,抛出 UnknownAccountException 异常
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
// 验证 Token 是否有效
if (!JWTUtil.verify(token, username, user.getPassword())) {
throw new AuthenticationException("Token 验证失败");
}
// 构造 SimpleAuthenticationInfo 对象,并返回
return new SimpleAuthenticationInfo(user, token, getName());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
// 从 PrincipalCollection 中获取当前用户信息
User user = (User) principalCollection.getPrimaryPrincipal();
// 查询用户的角色和权限信息
Set<String> roles = userService.findRolesByUsername(user.getUsername());
Set<String> permissions = userService.findPermissionsByUsername(user.getUsername());
// 构造 SimpleAuthorizationInfo 对象,并设置角色和权限信息
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.setRoles(roles);
authorizationInfo.setStringPermissions(permissions);
return authorizationInfo;
}
}
```
然后,在 Shiro 的配置文件中,需要将 JWTRealm 注册为一个 Realm,并关闭默认的 Session 和 Cookie 管理:
```xml
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="jwtRealm" />
</bean>
<bean id="jwtRealm" class="com.example.JWTRealm" />
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager" />
<property name="arguments" ref="securityManager" />
</bean>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- ... -->
<property name="securityManager" ref="securityManager" />
<!-- ... -->
</bean>
```
最后,需要在登录接口处生成 JWT Token,并返回给前端:
```java
@PostMapping("/login")
public Map<String, Object> login(@RequestBody Map<String, String> params) {
String username = params.get("username");
String password = params.get("password");
// 验证用户名和密码
if (userService.verify(username, password)) {
// 生成 JWT Token
String token = JWTUtil.sign(username, password);
// 将 Token 返回给前端
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("token", token);
return resultMap;
} else {
throw new AuthenticationException("用户名或密码错误");
}
}
```
以上代码只是一个简单的示例,实际应用中可能还需要进行一些优化和增强。希望能对你的 Shiro 整合 JWT 有所帮助!
阅读全文