首页 > 解决方案 > Spring Rest 在上下文中设置自定义对象

问题描述

我正在使用 Spring Rest 来创建 Rest API。对于身份验证,我创建了一个从 扩展的过滤器OncePerRequestFilter,该过滤器检查标头中是否存在有效令牌。我必须在 Spring 上下文中设置一些自定义对象信息。这样我就可以在我的 Controller 类中检索它。就像是:

AuthenticationFilter extends OncePerRequestFilter {
    // validation goes here

    requestContext.setSecurityContext(new SecurityContext() {
        public Principal getUserPrincipal() {
            return new UserInfo("", token, userID, userType);
        }
    }
});

标签: javaspringrestapisecurity

解决方案


不要为身份验证创建自定义过滤器。相反,用户安全上下文非常强大。

我不知道如何将自定义对象放入 spring 上下文中。但我可以向您展示如何在 Spring 框架中创建自定义上下文,然后将其用作任何其他上下文。当然,您将能够将自定义对象放入其中。

伪代码:

1.)创建您想要在上下文中拥有的自定义对象:

public class UserInfo implements Serializable {

private String id;    
private String email;

//Getters and setters
}

2.) 创建自定义上下文:

@Service
public class UserInfoContext {

private static final ThreadLocal<UserInfo> userInfoThreadLocal = new InheritableThreadLocal<>();

public void setUserInfo(UserInfo userInfo) {
    UserInfoContext.userInfoThreadLocal.set(userInfo);
}

public UserInfo getUserInfo() {
    return UserInfoContext.userInfoThreadLocal.get();
}

public void clearContext() {
    UserInfoContext.userInfoThreadLocal.remove();
}
}

3.) 创建自定义拦截器以在自定义上下文中初始化自定义对象

@Service
public class UserInfoInterceptor implements HandlerInterceptor {

private UserInfoContext userInfoContext;

@Autowired
public UserInfoInterceptor(UserInfoContext userInfoContext) {
    this.userInfoContext = userInfoContext;
}

@Override
public boolean preHandle(HttpServletRequest requestServlet, HttpServletResponse responseServlet, Object handler) throws Exception {
    // Call userInfoContext.setUserInfo() with custom data.
    return true;
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
    userInfoContext.clearContext();
}
}

感谢 ThreadLocal,您可以保存有关当前用户的自定义信息。


推荐阅读