2016-04-12 8 views
0

Geçerli Kullanıcı nesnesini CustomAuthenticationProvider'ım tarafından döndürülen UsernamePasswordAuthenticationToken içine koymaya çalıştığımda bazı sorunlarla karşılaştım. . Ben de yay security.xml göstermek gerekir başında, bu şuna benzer: YaniKullanıcı nesnesinin nasıl kullanılır UserPasswordAuthenticationToken (AuthenticationProvider)?

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/sign/in" access="isAnonymous()" /> 
    <intercept-url pattern="/sign/up" access="isAnonymous()" /> 
    <intercept-url pattern="/secret/page" access="isAuthenticated()" /> 
    <intercept-url pattern="/sign/out" access="isAuthenticated()" /> 
    <intercept-url pattern="/user/myinfo" access="isAuthenticated()" /> 

    <form-login 
     login-page="/sign/in" 
     default-target-url="/secret/page" 
     authentication-failure-url="/sign/in?failed=1" 
     password-parameter="password" 
     username-parameter="email" 
    /> 
    <csrf disabled="true"/> 
    <logout 
     logout-url="/sign/out" 
    /> 

    </http> 
    <authentication-manager erase-credentials="false"> 
    <authentication-provider ref="customAuth"> 
    </authentication-provider> 
    </authentication-manager> 

    <beans:bean id="customAuth" class="milkiv.easyword.controller.sign.CustomAuthenticationProvider"/> 

Ben/benim e-posta ve şifre girmek nereye Sayfanın/işareti oturum açmak AuthenticationProvider'ın bir sonraki kodu Ben her zaman giriş sayfası = "/ sign/in" olarak tanımladığım sayfaya yönlendirildim (hata-url değil, ben kontrol ettim). Bu arada, Kullanıcı adı yerine sadece Kullanıcı Adı yerine koyulursa iyi çalışıyor. Benimki AuthenticationProvider kod yanındadır:

@Service(value = "customAuth") 
public class CustomAuthenticationProvider implements AuthenticationProvider { 

    @Autowired 
    public Storages storage; 

    @Override 
    @Transactional 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    String login = authentication.getName(); 
    String password = authentication.getCredentials().toString(); 
    User user = storage.uSM.findByEmailAndPassword(login, password); 
    if (user == null) { 
     return null; 
    } else { 
     // if to pur here login insted of user it works fine 
     return new UsernamePasswordAuthenticationToken(user, password); 
    } 
    } 

    @Override 
    public boolean supports(Class<?> authentication) { 
    return authentication.equals(UsernamePasswordAuthenticationToken.class); 
    } 

} 

İlginç olan, bu benim testinde, yani görünür:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:resources/spring-context.xml", "classpath:resources/spring-security.xml"}) 
@WebAppConfiguration 
public class InTest { 

    MockMvc mockMvc; 

    Storages storages; 

    @Autowired 
    private Filter springSecurityFilterChain; 

    private final String nickname = "LoremIpsum"; 
    private final String email = "[email protected]"; 
    private final String password = "loreamipsumpassword"; 

    @Autowired 
    WebApplicationContext wac; // cached 

    @Before 
    public void doBeforeTests() { 
    mockMvc = MockMvcBuilders 
     .webAppContextSetup(wac) 
     .addFilters(springSecurityFilterChain) 
     .build(); 
    ApplicationContext context = new ClassPathXmlApplicationContext("resources/spring-context.xml", "resources/spring-security.xml"); 
    storages = context.getBean(Storages.class); 
    } 

    @Test 
    public void testSignIn() throws Exception { 
    mockMvc.perform(
     formLogin() 
      .user("email", email) 
      .password(password) 
    ) 
     .andExpect(redirectedUrl("/secret/page")); 

} }

.andExpectFunction (redirectedUrl ("/ sırrı/page ")) default-target-url ="/secret/page "dizinine yönlendirildiğimi söyleyebilirim, bu yüzden bundan sonra bir şeyler ters gider. AuthenticationProvider'ın bir şekilde AuthenticatioManager ile çalıştığını okuduğumda, sorun şu an bir yerde olabilir mi? Birisi bana hatamı açıklayabilir mi, ya da ne olduğunu anlamaya yardımcı olabilir, ya da anlamamı sağlayan başka bir bağlantı ya da başka bir şey verebilir. Her türlü yardıma minnettar olurum. Herkese şimdiden teşekkürler.

ADD Kullanıcı modeli:

public class User { 
    private int userId; 

    @NotBlank (message = "Email field can not be empty or missed") 
    @Size(min = 5, max = 128, message = "Email field must have from 5 to 128 symbols") 
    @Email(message = "Email field must have email format.") 
    private String email; 

    @NotBlank (message = "Password field can not be empty or missed") 
    @Size (min = 5, max = 32, message = "Password field must have from 5 to 32 symbols") 
    private String password; 

    @NotBlank (message = "Confirm password field can not be empty or missed") 
    @Size (min = 5, max = 32, message = "Confirm password field must have from 5 to 32 symbols") 
    private String confirmPassword; 

    @NotBlank (message = "Nickname field can not be empty or missed") 
    @Size (min = 3, max = 32, message = "Nickname field must have from 3 to 32 symbols") 
    private String nickname; 


    private Date registrationDate; 

    private Set studyLanguages; 

    public User(){ 
    } 

    public int getUserId() { 
    return userId; 
    } 

    public void setUserId(int userId) { 
    this.userId = userId; 
    } 

    public String getEmail() { 
    return email; 
    } 

    public void setEmail(String email) { 
    this.email = email; 
    } 

    public String getPassword() { 
    return password; 
    } 

    public void setPassword(String password) { 
    this.password = password; 
    } 

    public String getNickname() { 
    return nickname; 
    } 

    public void setNickname(String nickname) { 
    this.nickname = nickname; 
    } 

    public Date getRegistrationDate() { 
    return registrationDate; 
    } 

    public void setRegistrationDate(Date registration_date) { 
    this.registrationDate = registration_date; 
    } 

    public Set getStudyLanguages() { 
    return studyLanguages; 
    } 

    public void setStudyLanguages(Set studyLanguages) { 
    this.studyLanguages = studyLanguages; 
    } 


    public String getConfirmPassword() { 
    return confirmPassword; 
    } 

    public void setConfirmPassword(String confirmPassword) { 
    this.confirmPassword = confirmPassword; 
    } 
} 
+1

kullanıyor olacaksınız Model modelinin yapısını gösterebilir misiniz? Ve sınıfın uygulanan bir toString() sınıfı var mı? –

+0

no, toString() uygulamasına sahip değil ... Gerekli mi? Göremedim ... ( Kullanıcı modeli kodunu ekledim. – Nickolas

+0

Modelin bir müdür olarak kullanılmasına uygun olması her zaman daha iyi. Bu durumda değil. –

cevap

1

Ben sorun UsernamePasswordAuthenticationToken (kullanıcı, şifre) yanlış bir şekilde kullanıyor olduğunu düşünüyorum. Burada UsernamePasswordAuthenticationToken yöntemi iki argümanı bekler: bir asıl (genellikle bir string kullanıcı adı) ve bir şifre.

Authentification object'dan yararlanarak harika çalışıyorsunuz, ancak kullanıcı nesnesi asıl olarak kabul edilmiyor, giriş yapılıyor.

@Service(value = "customAuth") 
public class CustomAuthenticationProvider implements AuthenticationProvider { 

    @Autowired 
    public Storages storage; 

    @Override 
    @Transactional 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    String login = authentication.getName(); 
    String password = authentication.getCredentials().toString(); 
    User user = storage.uSM.findByEmailAndPassword(login, password); 
    if (user == null) { 
     return null; 
    } else { 
     // Here use the user object to only check if the user exists in the database if not null use his login (principal) and password 
     return new UsernamePasswordAuthenticationToken(login, password); 
    } 
    } 

    @Override 
    public boolean supports(Class<?> authentication) { 
    return authentication.equals(UsernamePasswordAuthenticationToken.class); 
    } 
} 

BAZI EK KAYNAKLAR: İşte

Eğer kullanıcı nesnesi bu kez aynı şeyi yapabileceği bir link olduğunu. UserDetails ve UserDetails

+0

Açıklamanız için çok teşekkürler. İlk kullanıcı bilgimi .addUserDetails ile eklemek yerine, yanlış yolu seçtiğimi anlıyorum. – Nickolas

+0

Size iyi "yanlış" bir şekilde denemek için bazı ek kaynaklar sağladım. Bunu nasıl yapacağınızı öğrenmek için :) –

İlgili konular