【问题标题】:How to get userinfo in springboot using keycloak?如何使用keycloak在springboot中获取用户信息?
【发布时间】:2018-08-12 19:16:27
【问题描述】:
我可以通过以下方式获取用户名:
@Autowired
private HttpServletRequest request;
Principal user = request.getUserPrincipal();
mqMessage.setUserName(user.getName());
但我想获取登录用户的名字和姓氏。
我怎样才能得到ff。使用 SpringBoot keycloak 适配器的用户信息?
【问题讨论】:
标签:
spring-mvc
spring-boot
spring-security
keycloak
keycloak-services
【解决方案1】:
KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) request.getUserPrincipal();
KeycloakPrincipal principal=(KeycloakPrincipal)token.getPrincipal();
KeycloakSecurityContext session = principal.getKeycloakSecurityContext();
AccessToken accessToken = session.getToken();
username = accessToken.getPreferredUsername();
emailID = accessToken.getEmail();
lastname = accessToken.getFamilyName();
firstname = accessToken.getGivenName();
realmName = accessToken.getIssuer();
Access realmAccess = accessToken.getRealmAccess();
roles = realmAccess.getRoles();
你可以利用上面的代码sn-p来获取名字和姓氏
这是来自 2.4.0
【解决方案2】:
使用 Keycloak 11 和 Spring 安全性实现
更多参考:https://www.keycloak.org/docs/latest/securing_apps/#_spring_security_adapter
import java.security.Principal;
/** More imports */
@GetMapping("/userinfo")
public String userInfoController(Model model, Principal principal) {
KeycloakAuthenticationToken keycloakAuthenticationToken = (KeycloakAuthenticationToken) principal;
AccessToken accessToken = keycloakAuthenticationToken.getAccount().getKeycloakSecurityContext().getToken();
model.addAttribute("username", accessToken.getGivenName());
return "page";
}
【解决方案3】:
我们可以使用 SecurityContextHolder 来获取用户详细信息。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
KeycloakPrincipal principal = (KeycloakPrincipal)auth.getPrincipal();
KeycloakSecurityContext session = principal.getKeycloakSecurityContext();
AccessToken accessToken = session.getToken();
String username = accessToken.getPreferredUsername();
String emailID = accessToken.getEmail();
String lastname = accessToken.getFamilyName();
String firstname = accessToken.getGivenName();
String realmName = accessToken.getIssuer();
AccessToken.Access realmAccess = accessToken.getRealmAccess();