栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Keycloak和Spring Boot Rest API-用户特定的数据策略

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Keycloak和Spring Boot Rest API-用户特定的数据策略

在Java
EE应用程序中,我们有类似的要求,用户可以在其中通过JSF网站创建数据。数据与审核信息(用户名,用户ID,时间戳等)存储在postrgesql中,因此我想要实现的正是这些。

我们仅通过通过会话中当前可用的访问令牌检索信息来实现。我们还在keycloak本身中引入了一个新的用户属性,它是一个自定义帐户ID。用户在密钥斗篷GUI上进行设置,然后我们通过accessToken.getOtherClaims()。get(“
ACCOUNT_ID”)进行检索,以查询特定于用户的数据。

令牌本身在过滤器中处理,并在另一个bean中使用,以检索看起来像

@WebFilter(value = "/*")public class RefreshTokenFilter implements Filter {  @Inject  private ServletOAuthClient oauthClient;  @Inject  private UserData userData;  @Context  KeycloakSecurityContext  sc;  @Override  public void init(FilterConfig filterConfig) throws ServletException {  }  @Override  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {    HttpServletRequest request = (HttpServletRequest) servletRequest;    HttpServletResponse response = (HttpServletResponse) servletResponse;    if (request.getUserPrincipal() != null) {      KeycloakSecurityContext keycloakSecurityContext = ((KeycloakPrincipal) request.getUserPrincipal()).getKeycloakSecurityContext();      userData.setAccessToken(keycloakSecurityContext.getToken());      userData.setIdToken(keycloakSecurityContext.getIdToken());    }    filterChain.doFilter(request, response);  }  @Override  public void destroy() {  }}

这里有处理数据访问的bean

@SessionScoped@Named("userData")public class UserData implements Serializable {  private static final String ACCOUNT_ID = "accountId";  private AccessToken accessToken;  private IDToken idToken;  public String getUserFullName() {    return isHasAccessToken() ? accessToken.getName() : null;  }  public String getUserName() {    return isHasAccessToken() ? accessToken.getPreferredUsername() : null;  }  public String getUserId() {    return isHasAccessToken() ? accessToken.getSubject() : null;  }  public String getRoles() {    StringBuilder roles = new StringBuilder();    if (isHasAccessToken()) {      accessToken.getRealmAccess().getRoles().stream().forEach(s -> roles.append(s).append(" "));    }    return roles.toString();  }  public boolean hasApplicationRole(String role) {    return accessToken.getRealmAccess().isUserInRole(role);  }  public boolean isHasAccessToken() {    return accessToken != null;  }  public List<String> getAccountIds() {    return isHasAccessToken() && accessToken.getOtherClaims().get(ACCOUNT_ID)!=null ? (List<String>) accessToken.getOtherClaims().get(ACCOUNT_ID) : new ArrayList<>();  }  public void setAccessToken(AccessToken accessToken) {    this.accessToken = accessToken;  }  public void setIdToken(IDToken idToken) {    this.idToken = idToken;  }}

我认为spring启动会为您提供类似的选项来处理KeycloakSecurityContext。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398986.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号