【问题标题】: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,如何手动设置主体?

标签: jax-rs servlet-filters


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    假设您在禁用弹簧安全性时需要委托人在场。请参阅以下链接以禁用安全性https://stackoverflow.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("{noop}pwd").roles("User").build();
            }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-02
      • 1970-01-01
      • 2021-03-11
      • 2010-12-19
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2013-04-19
      相关资源
      最近更新 更多