SpringBoot开发Keycloak token的获取以及校验

通过Keycloak的登录页跳转Client方式获取token

client开发

client的demo开发参考:SpringBoot集成Keycloak简单实例

查看token

我们在后台的Controller中打上断点。
当我们登陆成功后,断点被触发,我们可以找到token的位置
在这里插入图片描述

获取token

上代码,直接调用getTokenString接口就能获取token字符串

	public static KeycloakPrincipal getKeycloakPrinciple(HttpServletRequest request){
        KeycloakPrincipal keycloakPrincipal = null;
        try{
            keycloakPrincipal = (KeycloakPrincipal)request.getUserPrincipal();
        }catch (Exception e){
            e.printStackTrace();
        }
        return keycloakPrincipal;
    }

    public static String getTokenString(HttpServletRequest request){
        String tokenString = null;
        try{
            tokenString = getKeycloakPrinciple(request).getKeycloakSecurityContext().getTokenString();
        }catch (Exception e){
            e.printStackTrace();
        }
        return tokenString;
    }

通过接口校验token

使用postman发送请求
请求URL:

http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token

方式:

POST

参数:

{
	client_id:"keycloakDemo",
	grant_type:"password",
	username:"test",
	password:"test"
}

发送请求结果如下
在这里插入图片描述

校验token

上代码

	private static String realm = "myrealm";
    private static String resource = "keycloakDemo";
    private static String authServerUrl = "http://localhost:8080/auth";
    public static boolean verifyToken(String token) {
        AccessToken accessToken = null;
        try {
            //1、设置client配置信息
            AdapterConfig adapterConfig = new AdapterConfig();
            //realm name
            adapterConfig.setRealm(realm);
            //client_id
            adapterConfig.setResource(resource);
            //认证中心keycloak地址
            adapterConfig.setAuthServerUrl(authServerUrl);
            //访问https接口时,禁用证书检查。
            adapterConfig.setDisableTrustManager(true);
            //2、根据client配置信息构建KeycloakDeployment对象
            KeycloakDeployment deployment = KeycloakDeploymentBuilder.build(adapterConfig);
            //3、执行token签名验证和有效性检查(不通过会抛异常)
            accessToken = AdapterTokenVerifier.verifyToken(token, deployment);
        }catch (Exception e){
            e.printStackTrace();
        }
        if(accessToken!=null){
            return true;
        }else{
            return false;
        }
    }

Keycloak依赖包如下

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-services</artifactId>
    <version>10.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-core</artifactId>
    <version>10.0.1</version>
    <scope>provided</scope>
</dependency>
Spring Boot框架可以集成Token实现登录校验功能,以下是一种实现方式: 首先,我们需要引入相关的依赖,包括Spring Security和JWT(JSON Web Token)依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.11.2</version> </dependency> ``` 然后,我们创建一个Token生成和校验的工具类,该类可以用于生成Token和解析Token中的信息,这里使用JWT生成Token: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class TokenUtils { @Value("${jwt.secret}") private String secret; private static String staticSecret; @PostConstruct private void init() { staticSecret = secret; } public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .signWith(SignatureAlgorithm.HS512, staticSecret) .compact(); } public static String getUsernameFromToken(String token) { return Jwts.parser() .setSigningKey(staticSecret) .parseClaimsJws(token) .getBody() .getSubject(); } public static boolean validateToken(String token, String username) { String tokenUsername = getUsernameFromToken(token); return tokenUsername.equals(username); } } ``` 接下来,我们创建一个登录接口,在用户登录时生成Token并返回给客户端: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class LoginController { @Autowired private TokenUtils tokenUtils; @Autowired private PasswordEncoder passwordEncoder; @PostMapping("/login") public String login(@RequestBody UserLoginRequest request) { String username = request.getUsername(); String password = request.getPassword(); // 根据用户名和密码验证登录信息,这里省略具体的验证逻辑 if (authenticate(username, password)) { String token = tokenUtils.generateToken(username); return token; } else { throw new RuntimeException("Invalid username or password"); } } private boolean authenticate(String username, String password) { // 验证用户名和密码,这里假设只有一个固定的用户名和密码 String validUsername = "admin"; String validPassword = "password"; return validUsername.equals(username) && passwordEncoder.matches(password, validPassword); } } ``` 最后,我们可以在需要进行登录校验的接口上加上`@PreAuthorize`注解,指定需要进行校验的权限: ```java import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") @PreAuthorize("hasRole('ROLE_USER')") public String hello() { return "Hello World!"; } } ``` 以上就是使用Spring Boot框架集成Token实现登录校验功能的基本步骤。通过生成Token并在需要校验的接口上进行权限校验,可以实现简单的登录功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值