Spring Auto проблема с входом - PullRequest
0 голосов
/ 24 марта 2011

Я пытаюсь реализовать нижеприведенный весенний автоматический вход в систему, но мой экземпляр authenticationManager выдает приведенное ниже исключение и не подключается автоматически. Как я могу получить экземпляр этого из Spring вручную? Я не использую пружинный контроллер, я использую bean-объект в области запросов JSF. Я получаю приведенное ниже исключение во время выполнения, когда контейнер пытается автоматически подключить аутентификациюManager. RequestCache поставляется в порядке. Должен ли я использовать метод в моей реализации UserDetailsService (userManager)? Я не вижу подходящего метода, предоставляемого UserDetailsService, который принимает объект UsernamePasswordAuthenticationToken. Есть идеи? конфиг:

 <http access-denied-page="/auth/denied.html">
        <intercept-url
            pattern="/**/*.xhtml"
            access="ROLE_NONE_GETS_ACCESS" />
        <intercept-url
            pattern="/auth/**"
            access="ROLE_ANONYMOUS,ROLE_USER" />
         <intercept-url
            pattern="/auth/*"
            access="ROLE_ANONYMOUS" />
         <intercept-url
            pattern="/registered/*"
            access="ROLE_USER" />
          <intercept-url
            pattern="/*"
           access="ROLE_ANONYMOUS" />
        <form-login
            login-processing-url="/j_spring_security_check.html"
            login-page="/auth/login.html"
            default-target-url="/registered/home.html"
            authentication-failure-url="/auth/login.html" />
         <logout invalidate-session="true" 
              logout-success-url="/" 
              logout-url="/auth/logout.html"/>
        <anonymous username="guest" granted-authority="ROLE_ANONYMOUS"/>
        <remember-me user-service-ref="userManager" key="e37f4b31-0c45-11dd-bd0b-0800200c9a66"/>
    </http>
    <!-- Configure the authentication provider -->
    <authentication-manager alias="am">
        <authentication-provider user-service-ref="userManager">
                <password-encoder ref="passwordEncoder" />
        </authentication-provider>
    </authentication-manager>

Исключение Инъекция автосвязанных зависимостей не удалась; вложенное исключение: org.springframework.beans.factory.BeanCreationException: не удалось автоматически связать поле: protected org.springframework.security.authentication.AuthenticationManager com.dc.web.actions.SignUpDetail.authenticationManager; вложенным исключением является org.springframework.beans.factory.NoSuchBeanDefinitionException: не определен уникальный бин типа [org.springframework.security.authentication.AuthenticationManager]: ожидается один соответствующий бин, но найдено 2: [org.springframework.agerrovideranManager # 0, org.springframework.security.authenticationManager] javax.faces.webapp.FacesServlet.service (FacesServlet.java:325)

 @Named

@ Scope ( "запрос") публичный класс Регистрация {

 @Inject
 RequestCache requestCache;

 @Inject
 protected AuthenticationManager authenticationManager;

 public String login(){
authenticateUserAndSetSession(utilities.getLoggedInUser(), (HttpServletRequest)        FacesUtils.getExternalContext().getRequest());
    return "/home.html";
}
 private void authenticateUserAndSetSession(Users user,
            HttpServletRequest request)
        {
     UserDetails details = userManager.loadUserByUsername(user.getUsername());
  UsernamePasswordAuthenticationToken usernameAndPassword = 
      new UsernamePasswordAuthenticationToken(
          user.getUsername(), "pwd", details.getAuthorities());

  // Authenticate, just to be sure
  Authentication auth = authenticationManager.authenticate(usernameAndPassword);

  // Place the new Authentication object in the security context.
  SecurityContextHolder.getContext().setAuthentication(auth);
}

Ответы [ 2 ]

1 голос
/ 01 марта 2015

@ c12 Если вы используете настроенную авторизацию на основе ролей, возможно, что внутренняя коллекция полномочий вашей UserDetails не заполнена внутри метода loadUserByUsername вашего UserManager класса; В этом случае вам потребуется вручную связать определенные роли с коллекцией полномочия . Посмотрите фрагмент кода ниже (в идеале он должен быть частью тела метода loadUserByUsername ); Предполагается, что... а) MyUser - ваш собственный пользовательский объект б) MyUserRole это ваш собственный объект роли c) userDetails - это то, что вы вернете из метода loadUserByUsername

MyUser myUser = userDao.getUserByUsername(username);
Set<GrantedAuthority> grantedAuthSet = new HashSet<GrantedAuthority>();
Set<MyUserRole> myUserRoleSet = myUser.getRoleSet();

for (Iterator<MyUserRole> iterator = myUserRoleSet.iterator(); iterator.hasNext();) {
    MyUserRole userRole = (MyUserRole) iterator.next();
    grantedAuthSet.add(new SimpleGrantedAuthority(userRole.getName()));
}

List<GrantedAuthority> grantedAuthList = new ArrayList<GrantedAuthority>(grantedAuthSet);
myUser.setAuthorities(grantedAuthList);
UserDetails userDetails = new User(myUser.getUsername(), myUser.getPassword(), true, true, true, true, myUser.getAuthorities());

Надеюсь, это поможет!

1 голос
/ 24 марта 2011

Это связано с тем, что Spring Security внутренне объявляет второй AuthenticationManager, так что у вас есть два из них. Вам нужно выбрать один из них с alias:

<authentication-manager alias = "am">
    ...
</authentication-manager>
<Ч />
@Inject @Named("am")
protected AuthenticationManager authenticationManager;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...