当前位置:首页 » 密码管理 » springsecurity密码加密

springsecurity密码加密

发布时间: 2022-06-09 10:35:12

‘壹’ 怎么用spring security

Spring Security如何控制权限概要 Spring使用由Filter组成的Chain,来判断权限。如下图所示:<!--[if !vml]--><!--[endif]-->Spring预定义了很多out-of-boxed filter供开发者直接使用。每个Filter一般情况下(有些Filter是abstract的),都和配置文件的一个元素(有的情况下可能是属性)对应。比如:AUTHENTICATION_PROCESSING_FILTER,对应配置文件里面的:http/form-login元素。 如果Spring提供的Filter不能满足系统的权限功能,开发者可以自定义Filter,然后把Filter放在某个Filter Chain的某个位置。可以替换掉原有Filter Chain的某个Filter,也可以放在某个Filter之前或者之后。 总之,Spring Security采用Filter Chain模式判断权限,Spring提供了一些Filter,也支持开发者自定义Filter。与WEB系统的集成 使用java EE的Filter(非Spring的Filter)机制,将需要权限判断的url,“牵引”给Spring的Filter Chain即可。 一般情况下,将所有的url都引入Filter Chain。当然也可以在web.xml配置需要权限判断的url(配置filter-mapping/url-pattern)。Spring的配置文件也支持过滤掉不需要权限判断的url(配置http/intercept-url元素)。控制内容 Spring Security提供了如下内容的控制:<!--[if !supportLists]-->1. <!--[endif]-->url;<!--[if !supportLists]-->2. <!--[endif]-->bean method;<!--[if !supportLists]-->3. <!--[endif]-->http session。 url:可以分为需要权限判断的url,不需要权限判断的url,登录表单url。通过我对spring相关帖子和参考文档的阅读,需要权限判断的url。仅限于做角色判断,就是说判断当前用户是否具有指定的角色。 bean method:Spring支持对Service layer method做权限判断。通过我对spring相关帖子和参考文档的阅读,也仅限于做角色判断。配置方式有2种:<!--[if !supportLists]-->1. <!--[endif]-->写在Java源代码里面,如:@Secured("ROLE_TELLER")(该方法只有具有TELLER角色的用户能够访问,否则抛出异常);<!--[if !supportLists]-->2. <!--[endif]-->写在配置文件里面,如:<protect method="set*" access="ROLE_ADMIN" />(该bean的所有set方法,只有具有ADMIN角色的用户能够访问,否则抛出异常)。 http session:控制一个用户名是否能重复登录,以及重复登录次数,并非重试密码次数。 另外,Spring Security还提供了如下一些功能:<!--[if !supportLists]-->1. <!--[endif]-->remember me,记住我;<!--[if !supportLists]-->2. <!--[endif]-->form-login登录控制;<!--[if !supportLists]-->3. <!--[endif]-->多种身份认证功能;<!--[if !supportLists]-->4. <!--[endif]-->用户密码加密和“salt”功能;<!--[if !supportLists]-->5. <!--[endif]-->http协议控制;<!--[if !supportLists]-->6. <!--[endif]-->访问端口控制;<!--[if !supportLists]-->7. <!--[endif]-->Pre-Invocation & After-Invocation。 remember me,记住我:还记得浏览器采用cookie记住用户名和密码自动登录吗?好像就是这个(不知道我理解错了没有,应该没有。只是我不大敢相信)。使用这个功能,开发者在登录页面,使用spring自定义的标签。 form-login登录控制:有些页面不允许匿名访问,那么当匿名访问这些页面的时候,将弹出(或者转到)form-login窗口(或者页面)。这里又牵引出2个问题:1,输入用户名和密码后怎样验证;2,密码是否需要加密,怎么加密。 多种身份认证功能:Spring提供了丰富的用户身份认证功能。身份认证是什么意思?比如您告诉我“我是神仙”。那么我会问您“凭什么证明您是神仙”。这就是身份认证。认证手段一般是保存到数据库表的用户名/密码,usb key,ldap等。一般情况下,我们都使用用户名/密码的。 用户密码加密和“salt”功能:密码采用md5,还是sha加密算法。如果我们对密码加密的时候,不想仅仅对密码加密,还想把用户名和密码放在一起加密做为加密后的密码。那么使用salt吧。salt支持也读取用户的其他属性,不仅是用户名。 http协议控制:哪些url,必须采用https访问呢?哪些url必须采用http访问呢?哪些又两者都可以呢?通过这个配置。 访问端口控制:类似http协议控制,控制url和访问端口之间的关系。 Pre-Invocation & After-Invocation:在方法调用之前做权限判断,还是方法调用之后做权限判断呢?一般情况下是之前调用。也有情况下是之后调用。具体例子可以看官方文档(22.3小节)。细粒度权限控制 由上面分析,我们看到url、method的权限判断,都仅限于用户角色权限判断。事实上Spring使用投票(Voter)机制,来做权限判断。用户角色权限也是一种投票。投票这个词,听起来不容易懂。举例:董事会开会,各个股东投票以表决决议是否通过。Spring的角色投票器,只会投出一票。我们平时所说的投票至少要2张票吧,一张还叫什么投票。Spring的投票有3种结果:允许、拒绝和弃权。弃权?真的有点晕。呵呵,这种情况下还弃权。 那么投票器,如何集成到Spring的Filter里面呢?Spring的Filter一般都由一个Manager支撑着。比如accessDecisionManager,可以由RoleVoter和BasicAclEntryVoter提供投票。accessDecisionManager根据RoleVoter,BasicAclEntryVoter投票结果,做出决策判断。 细粒度(数据级)的权限控制,Spring Security提供了一种模型以及相关实现。下面我简要说说这个模型。举例:张三授权查询华北区域客户资料,李四授权查询华南区域客户资料。那么,首先会对所有客户记录做个标示(相当于取个id),然后在acl-entry表给张三授权华北所有客户访问权限;给李四华南区域所有客户权限。表记录大致是这样的:访问用户被访问数据授权操作张三华北电力客户1读取张三华北电力客户2读取李四华南电力客户1读取………这个模型的缺点是非常明显的:<!--[if !supportLists]-->1. <!--[endif]-->和业务数据绑定死了,业务数据的增/删,需要维护该权限表;<!--[if !supportLists]-->2. <!--[endif]-->在大数据量的情况下,系统效率低下。 因此,开发者需要自己书写投票器了。我们理想中的权限管理客户对权限管理的需求 这里是指我们服务的最终用户,而不是软件开发者。客户对权限管理的需求,大体可以概括如下:<!--[if !supportLists]-->1. <!--[endif]-->自主灵活地管理角色、角色权限,并将角色赋予系统相关用户;<!--[if !supportLists]-->2. <!--[endif]-->数据安全。系统展现数据是满足权限的,在系统内部搜索数据也必须在相应权限访问内,对系统数据进行增加、修改、删除必须是满足权限的;<!--[if !supportLists]-->3. <!--[endif]-->没有功能的按钮、菜单、数据等等,就不要在界面上出现了。开发中遇到的难点 管理用户、角色、权限,以及三者之间的关系,这种典型的RBAC模型,非常容易,没有任何困难。 困难的是,数据级权限控制。这是和业务直接挂钩的,最复杂,而且会经常因为客户需求表达不到位、开发人员需求理解不到位、系统框架库表结构发生变化,而不断变化的。这种变化,不仅需要编码,而且还需要重新测试。甚至这种变化会波及到其他模块,甚至整个系统。系统开发经历几次变化下来,代码里面散布着if/else,散布着sql语句。导致bad smell。我们理想的权限管理 我们期望的权限管理,应该具有这么几个特性:<!--[if !supportLists]-->1. <!--[endif]-->能实现角色级权限;能实现数据级权限;<!--[if !supportLists]-->2. <!--[endif]-->简单、易操作,能够应对各种需求;<!--[if !supportLists]-->3. <!--[endif]-->应对需求变更能力强;<!--[if !supportLists]-->4. <!--[endif]-->最好有相关界面,比如权限管理界面、角色管理界面,角色和权限关系维护界面,用户和角色关系维护界面。如果没有界面,也是可以接受的。毕竟这些页面需要最终用户来使用,不同用户对系统的界面要求不同。因此我们并不期望统一的管理界面。 Spring Security的评价 在Spring Security世界里,可以区分出哪些资源可以匿名访问,哪些需要角色权限,又是哪个页面提供登录功能;怎样进行用户身份认证,用户的密码如何加密。哪些资源必须使用https协议,资源和访问端口有怎样的对应关系。 下面就优点和缺点对Spring Security进行点评。优点 总体说来Spring Security具有以下几个优点:<!--[if !supportLists]-->1. <!--[endif]-->提供了一套权限框架,这套框架是可行的;<!--[if !supportLists]-->2. <!--[endif]-->提供了很多用户身份认证功能,可以节约大量开发工作;<!--[if !supportLists]-->3. <!--[endif]-->提供了角色判断功能,这点既是优点又是缺点;<!--[if !supportLists]-->4. <!--[endif]-->提供了form-login、remember me等控制。 其中2、4两点,对于我们中国开发者(我对国外系统不大了解),可用性并不大。我们的系统大多采用用户名/密码身份认证模式,大多公司都有可复用代码。form-login、remember me等这些功能,并不是难以开发,而且可用之处也并不多。缺点 我个人认为Spring Security存在以下几个硬伤:<!--[if !supportLists]-->1. <!--[endif]-->角色被“编码”到配置文件和源文件,这样最终用户就不能创建角色了。但最终用户期望自己来控制角色。因为在项目实施过程中,客户可能并不能确定有哪些角色,以及角色怎么分配给系统用户。角色大多需要等到系统上线后,才能确定。这些编码有:<!--[if !supportLists]-->a) <!--[endif]-->url的权限控制,<intercept-url pattern="/**" access="ROLE_USER" />;<!--[if !supportLists]-->b) <!--[endif]-->java方法的权限控制,@Secured("IS_AUTHENTICATED_ANONYMOUSLY");<!--[if !supportLists]-->c) <!--[endif]-->java方法的权限控制,<protect method="set*" access="ROLE_ADMIN" />;<!--[if !supportLists]-->2. <!--[endif]-->RBCA这种被广泛运用的模型,没有在Spring Security体现出来;<!--[if !supportLists]-->3. <!--[endif]-->Spring Security没有提供好的细粒度(数据级)权限方案,提供的缺省实现维护工作量大,在大数据量情况下,几乎不可用;<!--[if !supportLists]-->4. <!--[endif]-->Spring Security对于用户、角色、权限之间的关系,没有提供任何一种维护界面。不过从Spring Security角度看,确实没有必要有界面。角色创建、角色和权限直接的关系,都被“编码”到配置文件和源文件了;<!--[if !supportLists]-->5. <!--[endif]-->Spring Security学习难度大,配置文件还是很多。我承认有很多高手,但我们也看到有很多新人加入软件开发领域。付出如此大的学习代价,获得这么一点点好处,个人觉得并不值得。 附言:本人在JavaEye创建“权限管理”圈子快2周了,吸引不少网友进来。我感到很高兴,也很荣幸。由于Spring Security运用范围还是比较广的,所以我打算好好学习一下,把学习经验和大家分享一下。

‘贰’ spring提供的几种密码加密方式

第一种:不使用任何加密方式的配置

[html]view plain

  • <beanid="AuthenticationProvider"

  • class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <!--明文加密,不使用任何加密算法,在不指定该配置的情况下,Acegi默认采用的就是明文加密-->

  • <!--<propertyname="passwordEncoder"><beanclass="org.acegisecurity.providers.encoding.PlaintextPasswordEncoder">

  • <propertyname="ignorePasswordCase"value="true"></property></bean></property>-->

  • </bean>


  • 第二种:MD5方式加密

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">

  • <!--false表示:生成32位的Hex版,这也是encodeHashAsBase64的,Acegi默认配置;true表示:生成24位的Base64版-->

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • </bean>


  • 第三种:使用MD5加密,并添加全局加密盐

    Java代码

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • <!--对密码加密算法中使用特定的加密盐及种子-->

  • <propertyname="saltSource">

  • <beanclass="org.acegisecurity.providers..salt.SystemWideSaltSource">

  • <propertyname="systemWideSalt"value="acegisalt"/>

  • </bean>

  • </property>

  • </bean>


  • 第四种:使用MD5加密,并添加动态加密盐

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.Md5PasswordEncoder">

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • <!--对密码加密算法中使用特定的加密盐及种子-->

  • <propertyname="saltSource">

  • <!--通过动态的加密盐进行加密,该配置通过用户名提供加密盐,通过UserDetails的getUsername()方式-->

  • <beanclass="org.acegisecurity.providers..salt.ReflectionSaltSource">

  • <propertyname="userPropertyToUse"value="getUsername"/>

  • </bean>

  • </property>

  • </bean>

  • 第五种:使用哈希算法加密,加密强度为256

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.ShaPasswordEncoder">

  • <constructor-argvalue="256"/>

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • </bean>

  • 第六种:使用哈希算法加密,加密强度为SHA-256

    [html]view plain

  • <beanid="AuthenticationProvider"class="org.acegisecurity.providers..DaoAuthenticationProvider">

  • <propertyname="userDetailsService"ref="userDetailsService"/>

  • <propertyname="passwordEncoder">

  • <beanclass="org.acegisecurity.providers.encoding.ShaPasswordEncoder">

  • <constructor-argvalue="SHA-256"/>

  • <propertyname="encodeHashAsBase64"value="false"/>

  • </bean>

  • </property>

  • </bean>


  • 上述配置只是在Acegi通过表单提交的用户认证信息中的密码做各种加密操作。而我们存储用户密码的时候,可以通过一下程序完成用户密码操作:

    [java]view plain

  • packageorg.hz.test;

  • importjava.security.NoSuchAlgorithmException;

  • importorg.springframework.security.authentication.encoding.Md5PasswordEncoder;

  • importorg.springframework.security.authentication.encoding.ShaPasswordEncoder;

  • publicclassMD5Test{

  • publicstaticvoidmd5(){

  • Md5PasswordEncodermd5=newMd5PasswordEncoder();

  • //false表示:生成32位的Hex版,这也是encodeHashAsBase64的,Acegi默认配置;true表示:生成24位的Base64版

  • md5.setEncodeHashAsBase64(false);

  • Stringpwd=md5.encodePassword("1234",null);

  • System.out.println("MD5:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidsha_256(){

  • ShaPasswordEncodersha=newShaPasswordEncoder(256);

  • sha.setEncodeHashAsBase64(true);

  • Stringpwd=sha.encodePassword("1234",null);

  • System.out.println("哈希算法256:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidsha_SHA_256(){

  • ShaPasswordEncodersha=newShaPasswordEncoder();

  • sha.setEncodeHashAsBase64(false);

  • Stringpwd=sha.encodePassword("1234",null);

  • System.out.println("哈希算法SHA-256:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidmd5_SystemWideSaltSource(){

  • Md5PasswordEncodermd5=newMd5PasswordEncoder();

  • md5.setEncodeHashAsBase64(false);

  • //使用动态加密盐的只需要在注册用户的时候将第二个参数换成用户名即可

  • Stringpwd=md5.encodePassword("1234","acegisalt");

  • System.out.println("MD5SystemWideSaltSource:"+pwd+"len="+pwd.length());

  • }

  • publicstaticvoidmain(String[]args){

  • md5();//使用简单的MD5加密方式

  • sha_256();//使用256的哈希算法(SHA)加密

  • sha_SHA_256();//使用SHA-256的哈希算法(SHA)加密

  • md5_SystemWideSaltSource();//使用MD5再加全局加密盐加密的方式加密

  • }

  • }

‘叁’ springsecurity登陆问题

是报什么错误,密码不正确吗,如果密码有加密,new UserDetail时,密码应该是加密后的密码。

‘肆’ spring security为什么要加密

spring security也就是被大家广为熟悉的acegi security,2007年底Acegi Security正式成为Spring Portfolio项目,并更名为Spring Security。Spring Security是一个能够为基于spring的企业应用系统提供描述性安全访问控制解决方案的安全框架。 他提供了一组可以基于springIoC(依赖注入,也称控制反转)和AOP(面向切面编程)应用上下文中配置的Bean,充分利用了Spring功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

‘伍’ 如何对数据库进行加密和解密

数据库账号密码加密详解及实例
数据库中经常有对数据库账号密码的加密,但是碰到一个问题,在使用UserService对密码进行加密的时候,spring security 也是需要进行同步配置的,因为spring security 中验证的加密方式是单独配置的。如下:
<authentication-manager>
<authentication-provider user-service-ref="userDetailService">
<password-encoder ref="passwordEncoder" />
</authentication-provider>
</authentication-manager>

<beans:bean class="com.sapphire.security.MyPasswordEncoder" id="passwordEncoder">
<beans:constructor-arg value="md5"></beans:constructor-arg>
</beans:bean>

如上述配置文件所示,passwordEncoder才是在spring security对账号加密校验的地方。
spring security在拦截之后,会首先对用户进行查找,通过自己定义的userDetailService来找到对应的用户,然后由框架进行密码的匹配验证。
从userDetailService得到user以后,就会进入到DaoAuthenticationProvider中,这是框架中定义的 ,然后跳入其中的authenticate方法中。
该方法会进行两个检查,分别是
* preAuthenticationChecks : 主要进行的是对用户是否过期等信息的校验,调用的方法在userDetail中有定义的。
* : 这个就是用户名密码验证的过程了。
而PasswordEncoder是我们xml中注入的bean,所以了,我们调用的则是我们自己完成的passwordEncoder
public class MyPasswordEncoder extends MessageDigestPasswordEncoder {
public MyPasswordEncoder(String algorithm) {
super(algorithm);
}

@Override
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
return encPass.equals(DigestUtils.md5DigestAsHex(rawPass.getBytes()));
}
}

这是我对其实现的一个简单版本,调用的就是spring自带的加密算法,很简单了,当然也可以使用复杂的加密方法,这个就靠自己了
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

‘陆’ spring安全框架在什么方法加密

你好,Spring框架是基础,它提供了基础的IOC和AOP服务。
Spring security 是在Spring的基础服务上,提供的基于Spring的企业应用系统安全访问控制的服务。
Spring Security框架大量使用了Spring框架的AOP服务。它不能脱离Spring而使用。

‘柒’ Java中的spring security登录验证好在哪里,相比较传统的登录加密验证

主要的是一整套完整的权限系统 和shiro差不多!

‘捌’ spring配置文件中的数据库用户名和密码怎么加密

一般spring容器启动时,通过PropertyPlaceholderConfigurer类读取jdbc.properties文件里的数据库配置信息。
通过这个原理,我们把加密后的数据库配置信息放到jdbc.properties文件里,然后自定义一个继承PropertyPlaceholderConfigurer的类重写processProperties方法,实现解密,把解密后的信息又放回去。

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:645
制作脚本网站 发布:2025-10-20 08:17:34 浏览:936
python中的init方法 发布:2025-10-20 08:17:33 浏览:632
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:821
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:731
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1066
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:299
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:160
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:852
python股票数据获取 发布:2025-10-20 07:39:44 浏览:763