在过滤器中设置用户主体

Posted

技术标签:

【中文标题】在过滤器中设置用户主体【英文标题】:Setting User Principal in filter 【发布时间】:2018-05-23 21:33:09 【问题描述】:

我有一个实现过滤器的身份验证过滤器。

通过将 ServletRequest 类型转换为 HTTPServletRequest,我可以获得 userPrincipal。

public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain)
        throws IOException, ServletException 



    HttpServletRequest httpServletRequest = (HttpServletRequest) request;

 // code to resolve user name from apikey

    Principal principal = httpServletRequest.getUserPrincipal();

我的问题是如何设置校长?这样我就可以传入经过身份验证的用户名;

还是应该使用 HttpServletRequestWrapper 将名称作为附加参数传递?

【问题讨论】:

通常,当您正确配置安全性时,容器会自动设置用户主体 如果应用程序已禁用spring security,如何手动设置主体? 【参考方案1】:

实际上我没有意识到 HttpServletRequestWrapper 有我可以覆盖的 getUserPrincipal() 方法

【讨论】:

【参考方案2】:

假设您在禁用弹簧安全性时需要委托人在场。请参阅以下链接以禁用安全性https://***.com/a/61120549/6459098

我们需要如下拦截器和 UserDetailsS​​ervice 来为每个请求设置自定义主体。

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception 
        if(request.getUserPrincipal()==null)//initially no principal found
            request.login("uname", "pwd");//add principal to request
        return true;
    

然后

@Component
class UserDetailsServiceTools implements UserDetailsService 
    @Override
        public UserDetails loadUserByUsername(String username)
            // TODO Auto-generated method stub
                return User.withUsername(username).password("nooppwd").roles("User").build();
        

【讨论】:

以上是关于在过滤器中设置用户主体的主要内容,如果未能解决你的问题,请参考以下文章

Google图表:在图表中设置精确的日期边界(使用过滤器滑块时)

在dojo过滤中设置第一项选择onChange

在弹簧过滤器中设置视图名称

如何在 Spring Boot 中设置过滤器链?

在wireshark中设置数据包长度过滤器

如何在 Access 2007 中设置第一个连续组合框不可见?