通过spring security将密码传递给dao对象

我正在使用struts2和spring security创建一个应用程序,并且几乎没有问题/问题。

  1. 如何将密码传递给DAO以便将密码和用户名与DB的结果进行比较? 我知道可以通过实现UserDetailsService并覆盖该方法来传递用户名

    public UserDetails loadUserByUsername(String username)

  2. 第二个问题是我在重写loadUserByUsername()调用了方法SecurityContextHolder.getContext().getAuthentication()得到了null对象。 这是为什么? 再次 – 如何获取用户将填写j_password字段的密码。

以下是我的代码:

web.xml中

   Frontend   contextConfigLocation classpath:applicationContext.xml   org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG /WEB-INF/configs/tiles-resources.xml     springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /*    struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  actionPackages fe.web.actions    struts2 /*    org.springframework.web.context.request.RequestContextListener   org.springframework.web.context.ContextLoaderListener   org.apache.tiles.web.startup.TilesListener    org.springframework.security.web.session.HttpSessionEventPublisher   

弹簧security.xml文件

               

UserAuthenticator

 package fe.security; import java.util.Collection; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; public class UserAuthenticator implements UserDetailsService{ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { System.out.println(username); SecurityContext con = SecurityContextHolder.getContext(); Authentication auth = con.getAuthentication(); //--the authentication object here is NULL String credentials = (String) auth.getCredentials(); System.out.println("Username=" + username); System.out.println("pass=" + credentials); return null; } } 

提前致谢!

================================================== ==============================

由于我没有足够的声誉,这是解决方案:

好的,仔细阅读了解我理解的Spring Security参考文档 。

问题是Spring Security将从UserDetails函数返回的UserDetails用户名和密码与j_usernamej_password字段进行比较。 这意味着DAO对象应该使用set字段username和password返回UserDetails。

关于可空的SecurityContextHolder.getContext().getAuthentication()问题的答案是,在成功validation后, SecurityContextHolder.getContext().getAuthentication()应该返回not-nullable对象。

问候

好的,仔细阅读了解我理解的Spring Security参考文档。

问题是Spring Security将从UserDetails函数返回的UserDetails用户名和密码与j_username和j_password字段进行比较。 这意味着DAO对象应该使用set字段username和password返回UserDetails

关于可空的SecurityContextHolder.getContext().getAuthentication()问题的答案是,在成功validation后, SecurityContextHolder.getContext().getAuthentication()应该返回不可为空的对象。

问候