SpringSecurity笔记3-Authenticating Users:Authenticaton Strategy

      每个应用程序在存储用户信息时采取的策略是不同的,可以是数据库,LDAP目录,CAS认证等,SpringSecurity支

持的认证策略有:

      (1)In-memory (Spring-configured) user repositories.
      (2)JDBC-based user repositories.
      (3)LDAP-based user repositories.
      (4)OpenID decentralized user identity systems.
      (5)Central Authentication System (CAS)
      (6)X.509 certificates
      (7)JAAS-based providers

      当然也支持用户自定义。

      下面的讲解以该配置为基础:

      <http auto-config="true">
            <intercept-url pattern="/**" access="ROLE_SPITTER" />
      </http>

1. 配置基于内存的用户信息Repository

    即在Spring配置文件中配置,使用<user-service>元素:

    <user-service id="userService">
           <user name ="habuma" password ="letmein" authorities ="ROLE_SPITTER,ROLE_ADMIN"/>
           <user name="twoqubed" password="longhorns" authorities="ROLE_SPITTER"/>
           <user name="admin" password="admin" authorities="ROLE_ADMIN"/>
    </user-service>

    使用<authentication-manager>元素注册认证管理器:

    <authentication-manager alias="authenticationManager">
             <authentication-provider user-service-ref="userService" />
    </authentication-manager>

    通过这种方式是注册了一个ProviderManager,认证管理将认证工作委托给一个或多个认证Provider, 此时认证

    Provider需要user service 提供User 信息。

    与上面配置等价的内嵌式配置(不推荐 ):

    <authentication-provider>
             <user-service id="userService">
                    <user name="habuma" password="letmein" authorities="ROLE_SPITTER,ROLE

                              _ADMIN"/>
             ...
             </user-service>
    </authentication-provider>

2. 配置基于数据库的用户信息Repository

    即使用:<jdbc-user-service>元素,使用原理与user-service相同:

    <jdbc-user-service id="userService" data-source-ref="dataSource" />

    该配置使用data-source-ref属性指定数据源,通过该配置user service查找用户信息的SQL为:

    select username,passwd,enabled from users where username = ?

    查找用户已经授权的用户SQL:

    select username,authority from authorities where username = ?

    上面着两条SQL语句需要确保用户信息和授权正好存储在指定的表users和authorities中,而jdbc-user-

    service提供了其他的属性用户客制化查找:

    (1) users-by-username-query:根据条件用户名查找用户的:username,passwd和enabled状态;

    (2) authorities-by-username-query: 根据条件用户名查找用户被授予的权限;

    (3) group-authorities-by-username-query:根据用户名查找用户被授予的组权限。

    示例:

    <jdbc-user-service id="userService" data-source-ref="dataSource"
            users-by-username-query =
                  "select username, password, true from spitter where username=?"
            authorities-by-username-query =
                  "select username,'ROLE_SPITTER' from spitter where username=?" />

3. 配置基于的用户信息Repository

    该配置适合于具有层级目录结构的授权体系。需要首先添加依赖:

    <dependency>
           <groupId>org.springframework.security</groupId>
           <artifactId>spring-security-ldap</artifactId>
           <version>3.0.7.RELEASE</version>
    </dependency>

    有两种配置方式:

    (1) With an LDAP-oriented authentication provider

    (2) With an LDAP-oriented user service

    (1) 声明一个LDAP Authentication Provider

    <authentication-manager alias="authenticationManager">
            <ldap-authentication-provider user-search-filter="(uid={0})"
             group-search-filter="member={0}"/>
    </authentication-manager>

    该配置中user-search-filter 和 group-search-filter属性用于提供一个过滤器,用与在基于LDAP查询用户和

    组信息时,默认情况下该查找是从LDAP的Root开始查找,下面的配置可以指定query base:

    <ldap-user-service id="userService"
            user-search-base="ou=people"
            user-search-filter="(uid={0})"
            group-search-base="ou=groups"
            group-search-filter="member={0}" />

    该配置中指定查找用户的组织从"people"开始,查找组织从"groups"开始。

    (2) 配置一个Passwdor Comparison

    默认的进行LDAP认证策略是执行一个bind操作,直接与LDAP Server交互认证;另一种做法是执行一个

    Comparison操作,这种方式是将密码发送至LDAP服务器,要求服务器进行密码比对,需要保证密码安全:

    <ldap-authentication-provider
            user-search-filter="(uid={0})"
            group-search-filter="member={0}">
            <password-compare />
    </ldap-authentication-provider>

    该配置默认需要登录表单中有userPassword属性,如果Password定义在不同的属性中,可配置成:

    <password-compare hash="md5" password-attribute="passcode" />

    配置中hash="md5"指定了密码的加密策略,默认支持的策略有:

    {sha},{ssha},md4,md5,plaintext,sha,sha-256

    (3) 声明一个LDAP User Service

    <ldap-user-service id="userService"
            user-search-base="ou=people"
            user-search-filter="(uid={0})"
            group-search-base="ou=groups"
            group-search-filter="member={0}" />

    (4)配置一个内嵌的LDAP Server

    默认情况下,SpringSecurity LDAP 认证家丁LDAP Server监听的端口为33389 on localhost, 如果要自定义

    在其他的机器上,需使用<ldap-server>元素:

    <ldap-server url="ldap://habuma.com:389/dc=habuma,dc=com" />

    内嵌的配置:

    <ldap-server root="dc=habuma,dc=com" />

    其中root是可选的,默认是"dc=springframework,dc=org",当然也可自己定义。

    <ldap-server root="dc=habuma,dc=com" ldif="classpath:users.ldif" />

    在上述这个配置中,将从classpath中查找所有LDIF文件,若要明确指定需使用ldif属性。

    示例LDIF file:

    dn: ou=groups,dc=habuma,dc=com
    objectclass: top
    objectclass: organizationalUnit

    ou: groups


    dn: ou=people,dc=habuma,dc=com
    objectclass: top
    objectclass: organizationalUnit
    ou: people


    dn: uid=habuma,ou=people,dc=habuma,dc=com
    objectclass: top
    objectclass: person
    objectclass: organizationalPerson
    objectclass: inetOrgPerson
    cn: Craig Walls
    sn: Walls
    uid: habuma
    userPassword: password

   
    dn: uid=jsmith,ou=people,dc=habuma,dc=com
    objectclass: top
    objectclass: person
    objectclass: organizationalPerson
    objectclass: inetOrgPerson
    cn: John Smith
    sn: Smith
    uid: jsmith
    userPassword: password

   
    dn: cn=spitter,ou=groups,dc=habuma,dc=com
    objectclass: top
    objectclass: groupOfNames
    cn: spitter
    member: uid=habuma,ou=people,dc=habuma,dc=com

4. 启用Remember-ME功能

    需在<http>元素中使用<remember-me>元素:

    <http auto-config="true" use-expressions="true">

            ...
            <remember-me key="spitterKey" token-validity-seconds="2419200" />
    </http>

    如果不指定token-validity-seconds="2419200",默认情况下在cookie中存储有效信息2周,指定该信息后将

    有效期改为4周。存储在Cookie中的数据包括username,password, expiration date,private key,这些数据

    在存储前均已经被MD5编码,默认的可以是:SpringSecured",此出自定义为"spitterKey". 使用该功能需要在

    Form 中增加属性:_spring_security_remember_me:

    <input id="remember_me" name="_spring_security_remember_me " type="checkbox"/>
    <label for="remember_me" class="inline">Remember me</label>.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值