Spring_Security_3.0.1 中文参考文档chapter 6 核心服务

来源:互联网 发布:cf冰龙刷枪软件 编辑:程序博客网 时间:2024/06/08 06:35

Chapter 6.核心服务

6.1 The AuthenticationManager,ProviderManager和AuthenticationProviders

6.1.1 DaoAuthenticationProvider

spring security中最简单的AuthenticationProvider实现是DaoAuthenticationProvider。

它是UserDetailsService的杠杆(作为DAO), 为了获得username, password和GrantedAuthority。它认证用户,通过简单比较密码,在UsernamePasswordAuthenticationToken中, 和UserDetailsService中加载的信息。

<bean id="daoAuthenticationProvider"class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"><property name="userDetailsService" ref="inMemoryDaoImpl"/><property name="saltSource" ref bean="saltSource"/><property name="passwordEncoder" ref="passwordEncoder"/></bean>

6.2 UserDetailsService实现

大多数认证供应器都是用了UserDetails 和UserDetailsService接口。 调用UserDetailsService中的单独的方法:

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
返回的UserDetails是一个接口,它提供了获得保证非空的认证信息,比如用户名,密码,授予的权限和用户账号是可用还是禁用。大多数认证供应器会使用UserDetailsService, 即使username和password没有实际用在这个认证决策中。

6.2.1 内存认证

一个简单的选择是使用安全命名空间中的 user-service元素:

<user-service id="userDetailsService"><user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /><user name="bob" password="bobspassword" authorities="ROLE_USER" /></user-service>
也支持使用外部的属性文件:

<user-service id="userDetailsService" properties="users.properties"/>
属性文件需要包含下面格式的内容

username=password,grantedAuthority[,grantedAuthority][,enabled|disabled]
比如

jimi=jimispassword,ROLE_USER,ROLE_ADMIN,enabledbob=bobspassword,ROLE_USER,enabled
6.2.2 jdbcDaoImpl

Spring Security也包含了一个UserDetailsService, 它包含从一个JDBC数据源中获得认证信息。内部使用了Spring JDBC,所以它避免了负责的功能完全的对象关系映射(ORM)只用来保存用户细节。如果你的应用使用了一个ORM工具, 你应该写一个自己的UserDetailsService 重用你已经创建了的映射文件。返回到JdbcDaoImpl, 一个配置的例子如下所示:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="org.hsqldb.jdbcDriver"/><property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/><property name="username" value="sa"/><property name="password" value=""/></bean><bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"><property name="dataSource" ref="dataSource"/></bean>
6.2.2.1 权限分组

默认情况下,JdbcDaoImpl会假设用户的权限都保存在authorities表中。

6.3 密码加密

Spring Security的PasswordEncoder 接口用来支持 对密码通过一些方式进行加密,并保存到媒介中。 这通常意味着密码被“散列加密”,使用一个加密算法,比如MD5或者SHA。

6.3.1 什么是散列密码?

一个散列(或摘要)算法是一个单向方法提供了一小段固定长度的输出数据(散列)从一些输入数据中
6.3.2 为散列加点儿盐

一个方法来帮助防止这种问题是使用高强度的密码策略来防止使用常用单词。另一个是在计算散列时使用“盐值”。这是一个对每个用户都知道的附加字符串,它会结合到密码中,在计算散列之前。Spring Security有一个SaltSource接口, 可以被验证供应器用来为特定的用户生成一个盐值。 使用盐值,意味着攻击者必须创建单独的散列字典,为不同的盐值, 这让攻击更难了。

6.3.3 散列和认证

0 0