2012-05-16 57 views
2

所以我明白你可以在Spring Security中检查一个基于userDetail属性的salt的密码,然后对它进行哈希以与数据库中的哈希进行比较,但是如果在创建时使用盐用户是随机的(并存储在数据库中),我是否需要创建自己的userDetails类,其中包含salt属性,然后将其设置为field spring安全性在securityApplicationContext中使用的属性?Spring Security 3 + Random Salt

如果是这样,我将如何去写我自己的userDetails类来完成?抱歉,Spring/Java仍然很新。

+1

如果盐是随机的,那么您的问题的答案是'是',那么您需要将其提供给验证过程。只需像其他任何类一样编写'userDetails'类即可。 –

+0

好吧,但那么我该如何告诉securityApplicationContext使用myCustomUserDetails类来存储用户而不是默认的userDetails类? – Felix

+0

你最好使用像Bcrypt这样的包含随机盐的算法。如果你在这里和其他地方在线搜索,你会发现这种事情[已经讨论过了](http://stackoverflow.com/a/8662496/241990)。 –

回答

1

好吧,但那么我该如何告诉securityApplicationContext使用myCustomUserDetails类来存储用户而不是默认的userDetails类?

像这样:

<b:bean id="customUserDetailsService" class="com.your.company.security.MyUserDetailsService"/> 

<s:authentication-provider user-service-ref="customUserDetailsService" /> 

这正好在你的安全上下文。

另外这可能会有所帮助。

Writing a custom UserDetailsService

+0

啊,我看到这篇文章,同时谷歌搜索答案,但我认为我现在更好地理解它。所以为了确保,我实现了我自己的userDetailsS​​ervice,并在'loadByUsername'方法中返回一个userDetails对象,它是我自己实现的userDetails,是否正确? – Felix

+0

是的。正好,然后你注入你的新UserDetailsS​​ervice。 – Simeon

+0

好吧,我得到了CustomUserDetailsS​​ervice和CustomUserDetails,但是当我尝试登录时说,用户名/密码组合不正确。不知道如何调试它。 SpringSecurity如何比较输入的密码和数据库?我把密码作为存储在数据库中的密码。 它是否与变量类型有关?我从数据库中获取salt和hash作为字节[],并在CustomUserDetails中获得: password = new String(myUser.getHash(),“UTF8”); salt = new String(myUser.getSalt(),“UTF8”); – Felix