从上面的表中可以看出,系统为我们提供了不同的认证提供者,每个认证提供者会对自己指定的证明信息进行认证,如 DaoAuthenticationProvider仅对UsernamePasswordAuthenticationToken这个证明信息进行认证。
在实际项目中,用户的身份和权限信息可能存储在不同的安全系统中(如数据库,LDAP服务器,CA中心)。
作为程序员,我们可以根据需要选择不同的AuthenticationProvider(认证提供者)来对自己的系统提供认证服务。
这里我们着重介绍DaoAuthenticationProvider,它从数据库中读取用户信息验证身份,配置如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1 <bean id="daoAuthenticationProvider"
class="org.springframework.security.providers.dao.DaoAuthenticationProvider"
2 p:passwordEncoder-ref="passwordEncoder"
3 p:userDetailsService-ref="userDetailsService"/>
4 <bean id="passwordEncoder"
5 class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>
还记得前面配置的RememberMeServices吗?它也有一个和DaoAuthenticationProvider同样的属性 userDetailsService,这是系统提供的一个接口(org.springframework.security.userdetails.UserDetailsService),在这里我们把它单独提出来进行介绍。
首先我们需要了解Spring Security为我们提供的另外一个重要的组件,org.springframework.security.userdetails .UserDetails接口,它代表一个应用系统的用户,该接口定义与用户安全信息相关的方法:
String getUsername():获取用户名;
String getPassword():获取密码;
boolean isAccountNonExpired():用户帐号是否过期;
boolean isAccountNonLocked():用户帐号是否锁定;
boolean isCredentialsNonExpired():用户的凭证是否过期;
boolean isEnabled():用户是否处于激活状态。
当以上任何一个判断用户状态的方法都返回false时,用户凭证就被视为无效。UserDetails接口还定义了获取用户权限信息的 getAuthorities()方法,该方法返回一个GrantedAuthority[]数组对象,GrantedAuthority是用户权限信息对象,这个对象中定义了一个获取用户权限描述信息的getAuthority()方法。
UserDetails即可从数据库中返回,也可以从其它如LDAP中返回,这取决与你的系统中使用什么来存储用户信息和权限以及相应的认证提供者。这里我们只重点介绍DaoAuthenticationProvider(从数据库中获取用户认证信息的提供者),本人水平有限,在项目中还没有机会用到其它提供者。说到这里,这个封装了用户详细信息的UserDetails该从哪儿获取呢?这就是我们接下来要介绍的UserDetailsService接口,这个接口中只定义了唯一的UserDetails loadUserByUsername(String username)方法,它通过用户名来获取整个UserDetails对象。
看到这里你可能会有些糊涂,因为前面提到的Authentication对象中也存放了用户的认证信息,需要注意Authentication对象才是 Spring Security使用的进行安全访问控制用户信息安全对象。实际上,Authentication对象有未认证和已认证两种状态,在作为参数传入认证管理器(AuthenticationManager)的authenticate方法时,是一个未认证的对象,它从客户端获取用户的身份信息(如用户名,密码),可以是从一个登录页面,也可以从Cookie中获取,并由系统自动构造成一个Authentication对象。而这里提到的 UserDetails代表一个用户安全信息的源(从数据库,LDAP服务器,CA 中心返回),Spring Security要做的就是将这个未认证的Authentication对象和UserDetails进行匹配,成功后将UserDetails中的用户权限信息拷贝到Authentication中组成一个完整的Authentication对象,共其它组件共享。
这样,我们就可以在系统中获取用户的相关信息了,需要使用到Authentication对象定义的Object getPrincipal()方法,这个方法返回一个Object类型的对象,通常可以将它转换为UserDetails,从而可以获取用户名,密码以及权限等信息。代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1 UserDetails details = (UserDetails)authentication.getPrincipal();
2
3 GrantedAuthority[] authority = details.getAuthorities();
前面介绍了DaoAuthenticationProvider,它可以从数据库中读取用户信息,同样也可以从一个用户属性文件中读取,下一篇文章中我们在介绍如何从数据库中读取用户信息,当然还会涉及到更深入的东西,比如根据自己系统的需要自定义UserDetails和 UserDetailsService,这个只是让你对整个系统有个简单的了解,所以我们使用用户属性文件(users.properties)来存储用户信息:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1 admin=admin,ROLE_SUPERVISOR
2
3 user1=user1,ROLE_USER
4
5 user2=user2,ROLE_USER
6
7 user3=user3,disabled,ROLE_USER
配置userDetailsService:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1 <bean id="userDetailsService"
2
3 class="org.springframework.security.userdetails.memory.InMemoryDaoImpl">
4 <property name="userProperties">
5 <bean class="org.springframework.beans.factory.config.PropertiesFactoryBean"
6 p:location="/WEB-INF/users.properties"/>
7 </property>
8 </bean>
InMemoryDaoImpl类是UserDetailsService接口的一个实现,它从属性文件里读取用户信息,Spring Security使用一个属性编辑器将用户信息为我们组织成一个 org.springframework.security.userdetails.memory.UserMap类的对象,我们也可以直接为它提供一个用户权限信息的列表,详见applicationContext-security.xml配置文件。
UserMap字符串的每一行都用键值对的形式表示,前面是用户名,然后是等号,后面是赋予该用户的密码/权限等信息,它们使用逗号隔开。比如:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1 admin=admin,ROLE_SUPERVISOR
定义了一个名为admin的用户登录密码为admin,该用户拥有ROLE_SUPERVISOR权限,再如users.properties文件中配置的名为user3的用户登录密码为user3,该用户拥有ROLE_USER权限,disabled定义该用户不可用,为被激活(UserDetails 的isEnabled方法)。
分享到:
相关推荐
基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip ...
总结,SpringSecurity是一个功能强大的安全框架,它为开发者提供了安全Web应用的全套解决方案。通过理解并熟练运用其核心概念和组件,我们可以构建出安全、健壮的应用程序。在学习过程中,分析提供的源代码和示例将...
### Spring Security 学习总结与应用实践 #### 引言 在深入了解Spring Security之前,我们需要认识到,传统的权限验证逻辑往往杂糅于业务逻辑之中,这种混合不仅使得代码难以维护,而且降低了系统的整体效率。每当...
Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛用于Java应用程序的安全性管理。这个压缩包包含了Spring Security 4.0.0版本所需的jar包,这是一组核心组件,为构建安全的Web应用提供了...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
Spring Security是一个功能强大、高度定制的安全框架,它专门用于为基于Spring的应用程序提供安全性解决方案。Spring Security架构的设计初衷是为了解决认证和授权的需求,确保应用程序的安全性。它提供了全面的安全...
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话管理以及安全相关的功能,可以帮助开发者构建安全的Web应用。在本笔记中,我们将深入探讨Spring...
Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中,我们将深入探讨Spring Security的核心概念以及如何将其应用于实际的Web应用程序开发。 首先,我们从用户、...
Spring Security 是一个强大的安全框架,主要用于Java Web应用的安全管理,包括认证、授权和访问控制等。在Spring Boot中,Spring Security 提供了简洁的API和自动化配置,使得开发者能够快速集成安全功能。在这个名...
Spring Security3 是一个基于 Java 的安全框架,提供了一个灵活的安全机制来保护基于 Spring 的应用程序。在这个总结中,我们将详细介绍 Spring Security3 的安全机制、原理和核心组件。 认证管理器 认证管理器是...
而Spring Security 则是 Java 开发中广泛使用的安全框架,用于实现认证和授权。当我们将这两者结合时,我们可以创建一个强大的统一登录认证鉴权系统。 首先,让我们深入了解Spring Cloud Gateway。这是一个基于...
Spring Security是Java领域一个强大的安全框架,提供了一套完整的访问控制和身份验证解决方案。 在Spring Security中,实现单点登录的关键在于会话管理。默认情况下,Spring Security允许用户在不同设备或浏览器上...
"springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在3.0版本中,Spring Security 已经相当成熟,提供...
Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,专为Java应用程序设计。它在Spring生态系统中扮演着核心安全组件的角色,使得开发者能够轻松地实现安全性需求,包括用户认证、授权、会话管理...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制等功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在这个名为 "mysecurity" 的压缩包中,很可能是...