2012-02-29 40 views
10

Tôi đang sử dụng bảo mật mùa xuân với Xác thực cơ bản HTTP để bảo mật ứng dụng web java. Trong webapp của tôi, tôi cần lấy tên người dùng và mật khẩu của người dùng hiện tại để xác thực thêm họ với một dịch vụ khác. Tôi có thể giữ tên người dùng, nhưng không phải mật khẩu.Truy xuất mật khẩu của người dùng hiện tại từ bảo mật mùa xuân

Tôi đã thử sử dụng SecurityContextHolder.getContext().getAuthentication() để truy cập thông tin này như được đề xuất ở đây How can I get plaintext password from spring-security? nhưng mật khẩu được trả lại là null.

Tôi có thể giữ mật khẩu bằng cách nào?

Cảm ơn.

Đây là tôi applicationContext-security.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

<sec:http authentication-manager-ref='authenticationManager'> 
    <sec:intercept-url pattern="/spring/**" access="ROLE_USER" /> 
    <sec:http-basic /> 
</sec:http> 

<bean id="basicAuthenticationFilter" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> 
    <property name="realmName" value="Announcements Rest Realm" /> 
</bean> 

<bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <property name="providers"> 
     <list> 
      <ref local="authProvider" /> 
     </list> 
    </property> 
</bean> 

<bean id="authProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="userDetailsService" /> 
</bean> 

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> 
    <constructor-arg> 
     <list> 
      <sec:filter-chain pattern="/spring/**" filters="basicAuthenticationFilter" /> 
     </list> 
    </constructor-arg> 
</bean> 

<sec:user-service id="userDetailsService"> 
    <sec:user name="admin" password="**" authorities="ROLE_USER, ROLE_ADMIN" /> 
    <sec:user name="user" password="**" authorities="ROLE_USER" /> 
</sec:user-service> 

Trả lời

0

Bạn có sử dụng nhớ đến tôi/chạy như/user switch? Trong trường hợp này, mật khẩu là null (như được mô tả trong một chủ đề bạn đã đề cập). Ngoài ra, có thể bạn phải sử dụng xác thực mẫu cơ bản, (yêu cầu gửi đến j_spring_security_check)

+0

Tôi không sử dụng ghi nhớ tôi, chạy hoặc chuyển người dùng theo như tôi biết (trừ khi chúng được bật theo mặc định ? Tôi không sử dụng tự động cấu hình). Ngoài ra tôi không thể sử dụng xác thực biểu mẫu vì webapp của tôi là dịch vụ web. – ssloan

+0

ok, vậy làm thế nào để bạn thông báo cho SI rằng người dùng đã được xác thực thành công? Nếu bạn sử dụng SecurityContextHolder.getContext(). SetAuthentication (...), thì bạn sẽ vượt qua loại mã thông báo nào? –

+0

Tôi không gọi trực tiếp setAuthentication() - nó phải xảy ra ở một trong những bean tôi đã cấu hình. Tôi sẽ cập nhật bài đăng của mình với trường hợp applicationContext-security.xml của tôi. – ssloan

0

Nếu bạn đang thiết lập toàn bộ chi tiết của người dùng hiện tại bao gồm mật khẩu trong đối tượng phiên, bạn có thể lấy mật khẩu từ đối tượng phiên đó.

+0

Điều duy nhất trong phiên là đối tượng tương tự quay lại từ getAuthentication và phương thức getcredentials() trả về null. – ssloan

+1

Điều này sẽ không hoạt động theo mặc định từ Mùa xuân 3.1 trở đi - thông tin đăng nhập sẽ bị xóa khi xác thực thành công.Xem http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#core-services-erasing-credentials –

22

Tôi đã tìm ra.

Tôi đã thay đổi thẩm định quản lý cấu hình của tôi để sử dụng các yếu tố xác thực-manager và thêm thuộc tính đó:

<sec:authentication-manager alias="authenticationManager" erase-credentials="false"> 
    <sec:authentication-provider ref="authProvider" />  
</sec:authentication-manager> 

tôi sau đó có thể sử dụng SecurityContextHolder.getContext().getAuthentication().getCredentials() trong lớp điều khiển của tôi để có được mật khẩu.

Nhờ sự giúp đỡ của bạn mặc dù Piotrek De

+0

Tìm tốt. Didnt biết về 'erase-credentials =" false "' – cowls

+0

Đó là những gì tôi cần, mặc dù tôi hơi lo ngại về các vấn đề bảo mật; nhưng tôi thấy không có cách nào hợp lý để tránh những vấn đề đó. –

+0

Hoạt động tốt với đăng nhập LDAP quá. – romhail

0

một cách tốt hơn là thực hiện 'userDetailsService' của bạn. vì vậy bạn có thể kiểm soát cách UserDetails có thể được inited khi thực hiện xác thực. tôi đã triển khai xác thực dựa trên biểu mẫu và đã viết dịch vụ người dùng tự định nghĩa của mình,

@Service("userService") 
public class UserServiceImpl extends GenericService<User> implements UserDetailsService,UserService{ 



    @Override 
     @Transactional 
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
       // Declare a null Spring User 
      UserDetails userDetails = null; 



      // Search database for a user that matches the specified username 
      // You can provide a custom DAO to access your persistence layer 
      // Or use JDBC to access your database 
      // DbUser is our custom domain user. This is not the same as Spring's User 
      User dbUser=this.findUserByUserName(username); 

      if (dbUser == null) { 
       throw new UsernameNotFoundException("HiMVC Security:: Error in retrieving user(username=" + username + ")"); 
      } 



      userDetails = new org.springframework.security.core.userdetails.User(
        dbUser.getUserName(), 
        dbUser.getPassword(),//here you can put a clear text password 
        true, 
        true, 
        true, 
        true, 
        loadUserAuthorities(username)); 


      return userDetails; 
     } 
Các vấn đề liên quan