【问题标题】:Get instance of AuthenticationManager Manually手动获取 AuthenticationManager 的实例
【发布时间】:2011-07-22 00:15:04
【问题描述】:

我正在尝试实现以下内容,但我的 authenticationManager 实例引发了以下异常并且没有自动装配。如何手动从 Spring 获取它的实例?我没有使用弹簧控制器,我使用的是 JSF 请求范围 bean。当容器尝试自动装配 authenticationManager 时,我在运行时收到以下异常。 requestCache 很好。我不明白为什么我有两个实例...

配置:

<authentication-manager>
        <authentication-provider user-service-ref="userManager">
                <password-encoder ref="passwordEncoder" />
        </authentication-provider>
    </authentication-manager>

自动装配依赖注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:受保护的 org.springframework.security.authentication.AuthenticationManager com.dc.web.actions.SignUpDetail.authenticationManager;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型 [org.springframework.security.authentication.AuthenticationManager] 的唯一 bean:预期单个匹配 bean 但找到 2:[org.springframework.security.authentication.ProviderManager #0,org.springframework.security.authenticationManager] javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

@Controller
public class SignupController
{

    @Autowired
    RequestCache requestCache;

    @Autowired
    protected AuthenticationManager authenticationManager;

    @RequestMapping(value = "/account/signup/", method = RequestMethod.POST)
    public String createNewUser(@ModelAttribute("user") User user, BindingResult result,  HttpServletRequest request, HttpServletResponse response)
    {
        //After successfully Creating user
            authenticateUserAndSetSession(user, request);

        return "redirect:/home/";
    }

    private void authenticateUserAndSetSession(User user,
        HttpServletRequest request)
    {
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                user.getUsername(), user.getPassword());

        // generate session if one doesn't exist
        request.getSession();

        token.setDetails(new WebAuthenticationDetails(request));
        Authentication authenticatedUser = authenticationManager.authenticate(token);

        SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
    }

}

【问题讨论】:

  • 你说authenticationManager 字段为空? requestCache 有线正常吗?
  • @skaffman 感谢您的回复,我用更多信息更新了我的问题。我之前发布的内容不正确,它不为空。容器说我有两个 authenticationManager 实例,但我不知道如何。我也在上面粘贴了我的配置,有什么想法吗?我只是想在成功注册后进行自动登录。我需要使用我的 userManager 来自动登录吗? userManager 没有采用 UsernamePasswordAuthenticationToken 的方法

标签: spring spring-security


【解决方案1】:

首先,为您的AuthenticationManager 提供一个明确的 bean 名称

<authentication-manager alias="authenticationManager">
   ...
</authentication-manager>

二、自动接线时使用限定符:

@Autowired
@Qualifier("authenticationManager")
protected AuthenticationManager authenticationManager;

【讨论】:

  • @Xorty 如果没有别名,您应该猜测身份验证管理器 bean 的自动生成名称(我不确定它是否有默认名称)。从理论上讲,如果您使用按类型而不是按名称进行绑定,它可能会起作用,尽管这在现实世界的系统中很少见。
  • @BorisKirzner 我如何使用它来验证我的用户对象,因为我需要在 httprequest 上从移动设备接收用户并对其进行身份验证并将会话 ID 作为令牌发送
  • @B.TIger 目前还不清楚您要解决的问题是什么。我建议打开一个单独的线程,因为在我看来它与原始问题无关。
  • 请注意:除了alias 之外,我还使用了id 属性,这导致了问题。确保您只使用alias
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多