通过spring security将密码传递给dao对象
我正在使用struts2和spring security创建一个应用程序,并且几乎没有问题/问题。
-
如何将密码传递给DAO以便将密码和用户名与DB的结果进行比较? 我知道可以通过实现
UserDetailsService
并覆盖该方法来传递用户名public UserDetails loadUserByUsername(String username)
-
第二个问题是我在重写
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_username
和j_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()
应该返回不可为空的对象。
问候