当前位置: 首页 > 面试题库 >

无法在Spring中自动将服务连接到我的身份验证过滤器中

施越彬
2023-03-14
问题内容

我正在尝试通过令牌对用户进行身份验证,但是当我尝试自动连接一个用户时,我的服务AuthenticationTokenProcessingFilter会出现空指针异常。
由于自动有线服务为空 ,如何解决此问题?

我的AuthenticationTokenProcessingFilter

@ComponentScan(basePackages = {"com.marketplace"})
public class AuthenticationTokenProcessingFilter extends GenericFilterBean {

    @Autowired
    @Qualifier("myServices")
    private MyServices service;

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        @SuppressWarnings("unchecked")
        Map<String, String[]> parms = request.getParameterMap();

        if (parms.containsKey("token")) {
            try {
                String strToken = parms.get("token")[0]; // grab the first "token" parameter

                User user = service.getUserByToken(strToken);
                System.out.println("Token: " + strToken);

                DateTime dt = new DateTime();
                DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
                DateTime createdDate = fmt.parseDateTime(strToken);
                Minutes mins = Minutes.minutesBetween(createdDate, dt);


                if (user != null && mins.getMinutes() <= 30) {
                    System.out.println("valid token found");

                    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
                    authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));

                    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getEmailId(), user.getPassword());
                    token.setDetails(new WebAuthenticationDetails((HttpServletRequest) request));
                    Authentication authentication = new UsernamePasswordAuthenticationToken(user.getEmailId(), user.getPassword(), authorities); //this.authenticationProvider.authenticate(token);

                    SecurityContextHolder.getContext().setAuthentication(authentication);
                }else{
                    System.out.println("invalid token");
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("no token found");
        }
        // continue thru the filter chain
        chain.doFilter(request, response);
    }
}

我尝试在我中添加以下内容 AppConfig

@Bean(name="myServices")
    public MyServices stockService() {
        return new MyServiceImpl();
    }

我的AppConfig注释是

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.marketplace")
public class AppConfig extends WebMvcConfigurerAdapter {

问题答案:

我只是通过添加使它起作用

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

我不确定为什么即使我尝试添加显式限定词也应该这样做。现在代码看起来像

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

        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

        @SuppressWarnings("unchecked")
        Map<String, String[]> parms = request.getParameterMap();

        if (parms.containsKey("token")) {


 类似资料:
  • 问题内容: 我正在尝试通过令牌对用户进行身份验证,但是当我尝试自动连接一个用户时,我的服务会出现空指针异常。由于自动有线服务为空,如何解决此问题? 我的课 我尝试在我中添加以下内容 我的AppConfig注释是 问题答案: 你不能使用开箱即用的过滤器中的依赖项注入。尽管你正在使用GenericFilterBean,但是Servlet过滤器不是由spring管理的。如javadocs所指出的 用简单

  • 我已经按照文档中的说明配置了MongoDB服务器https://docs.mongodb.com/manual/core/security-x.509/我使用mongo shell连接,工作正常。 接下来,我尝试连接到相同的服务器form c#驱动程序,但引发超时异常。下面是我的代码 我通过MongoDB服务器日志,我可以看到下面的错误 2017-04-10T11:18:21.559 0530 I

  • 嗨,我正在学习Spring安全,我被困在自定义认证过滤器中。我有以下文件:主应用程序文件: : 我的安全配置文件安全: 最后我的CustomAuthentication filter文件:< code > customauthenticationfilter . Java : 因此,我已经将<code>attemptAuthentication</code>方法放在日志中,但似乎请求没有到达那里。

  • 我们创建了一个具有 JDBC 后端令牌存储的授权服务器。GitHub 上托管了类似的实现。它在我们的环境中使用不同的授权类型运行良好。不同的 Web 应用程序将其用于 SSO,并颁发令牌,然后这些令牌也用于使用 API。 我们需要一种方法让用户登录,如果从外部IDP返回的用户是经过身份验证的,就颁发令牌,这有点类似于用户从登录表单手动登录。 我们必须使用外部IDP身份验证来扩展此服务器。因此,如果

  • 连接到服务器时出错:fatal:用户“postgres”的密码身份验证失败 fatal:用户“postgres”的密码身份验证失败

  • 我正在运行带有公开WebSocketendpoint的服务器。下面是我的: 问题是如何使用或或查询参数实现建立WS连接的身份验证? 更好的选择是避免使用Spring Security。 多谢了。