shiro+jwt如何实现单点登录,代码实例

  • Post author:
  • Post category:其他


Shiro 支持使用 JSON Web Token (JWT) 实现单点登录 (SSO)。

实现步骤如下:

  1. 在服务端生成 JWT 并返回给客户端。
  2. 客户端保存 JWT 并在请求中加上 HTTP Header,如 “Authorization: Bearer JWT”。
  3. 服务端收到请求后验证 JWT 的有效性。
  4. 如果 JWT 有效,则允许访问请求的资源。

以下是一个使用 Shiro 实现 JWT 验证的示例代码:

“`java import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection;

import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts;

public class JwtRealm extends AuthorizingRealm {

private String secretKey;

public JwtRealm(String secretKey) {
    this.secretKey = secretKey;
}

@Override
public boolean supports(AuthenticationToken token) {
    return token instanceof JwtToken;
}

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    // 这里可以根据 JWT 中的自定义字段来进行权限控制
    return null;
}

@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    JwtToken jwtToken = (JwtToken) token;
    String jwt = jwtToken.getPrincipal().toString();
    Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
    // 验证 JWT 是否过期
    if (claims.getExpiration().before(new Date())) {
        throw new AuthenticationException("JWT 已过期");
    }
    // 这里可以使用 claims 中的用户信息来创建 SimpleAuthenticationInfo 对象
    return new SimpleAuthenticationInfo(jwt, jwt, "j



版权声明:本文为weixin_35755434原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。