AuthenticationProvider
public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); }
该接口是开始认证的入口,传入用户输入的用户名密码到authenticate方法中进行验证,通过认证就返回用户完整的信息,若认证过程中有任何的错误,就直接抛出AuthenticationException。接下来实现一个简单的AuthenticationProvider:
1. 项目security.xml中添加如下代码:
<security:authentication-manager> <security:authentication-provider ref='myAuthenticationProvider'/> </security:authentication-manager>
2. 创建java类MyAuthenticationProvider 实现AuthenticationProvider接口:
@Component public class MyAuthenticationProvider implements AuthenticationProvider { @Override public boolean supports(Class<?> authentication) { return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); } @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String password = authentication.getCredentials().toString(); if (!"silentwu".equals(username)) { throw new UsernameNotFoundException("用户不存在"); } if (!"123456".equals(password)) { throw new BadCredentialsException("密码错误"); } return new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))); } }
用户在登录界面中输入用户名:silentwu 密码:123456 那么通过认证,否则返回对应的错误信息。
UserDetailsService
public interface UserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; }
这个接口是认证过程的重要接口,只有一个方法,就是通过用户的唯一标识获取到用户的完整信息,包括密码和权限等。接着来看一个简单的实现:
1. 在security.xml中添加如下代码:
<security:authentication-manager> <security:authentication-provider user-service-ref='myUserDetailsService'/> </security:authentication-manager>
2. 创建Java类MyUserDetailsService ,实现UserDetailsService
@Component public class MyUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { return new User("silentwu", "123456", Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))); } }
在这个类中直接返回一个User对象,用户名是silentwu,密码是123456,对应用户输入的信息是否正确的检测,spring-security已经帮我们检测了
JdbcDaoImpl
通常情况下我们的用户数据都是存放到数据库中的,那么在用户登录的时候需要查询数据库进行验证,spring-security通过JdbcDaoImpl实现了这个功能,JdbcDaoImpl是UserDetailsService的一个子类。
<!--[if !supportLists]-->1.
1. <!--[endif]-->在数据库中执行如下代码:
CREATE TABLE users( username VARCHAR(50) NOT NULL PRIMARY KEY, PASSWORD VARCHAR(50) NOT NULL, enabled BOOLEAN NOT NULL ); CREATE TABLE authorities ( username VARCHAR(50) NOT NULL, authority VARCHAR(50) NOT NULL, CONSTRAINT fk_authorities_users FOREIGN KEY(username) REFERENCES users(username) ); CREATE UNIQUE INDEX ix_auth_username ON authorities (username,authority); insert into `authorities`(`username`,`authority`) values ('silentwu','ROLE_USER'); insert into `users`(`username`,`password`,`enabled`) values ('silentwu','12345',1);
2. 在security.xml中添加代码:
<security:authentication-provider> <security:jdbc-user-service data-source-ref="securityDataSource"/> </security:authentication-provider> </security:authentication-manager>
或者
<security:authentication-manager> <security:authentication-provider user-service-ref='myUserDetailsService'/> </security:authentication-manager> <bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <property name="dataSource" ref="securityDataSource"/> </bean>
这两种方式都是同样的效果
这样JdbcDaoImpl配置就完成了,很简单。
原理:
首先通过用户提交的用户名查询出用户信息,若没有查询到用户,那么就抛出UsernameNotFoundException
通过查询出来的用户去查询用户的权限表,获取用户的权限
创建UserDetails,返回
相关推荐
spring-security cookie认证
登录认证方式和spring-boot-security有所不同。该版本登录认证采用自定义的/auth/login方式替代security默认的 /login(当然这个也是可以指定的)登录地址,简单来说也就是在自己的controller中实现了登录方法。这样...
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
springboot集成spring-security,实现自定义登录认证,代码亲测,同时附带jwt+security集成的代码,亲测可用
spring-security使用数据库用户认证
Springboot + Spring Security 实现前后端分离登录认证及权限控制采用的session模式
spring-security-3.2 资源用于权限控制和系统设置
Spring-Security结合JWT 实现前后端分离完成权限验证功能案例,案例中,主要完成用户登录获取Token,通过Token访问Rest接口,没有权限或授权失败时返回JSON,前端根据状态码进行重新登录;案例中的用户名称: jake_j...
pring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。 Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件...
demo包含了两方面的内容:1,用户身份认证;2,用户权限管理,主要使用spring-cloud-security来进行安全管理设计
spring-Security简单例子,实现了对登录,访问权限的一些简单认证
springboot项目集成了spring-security oauth2.0框架的一个小案例。 资源服务和认证服务分离了。
Spring Security为基于J2EE企业应用软件提供了全面安全服务。 特别是使用领先的J2EE解决方案-spring框架开发的企业软件项目。 如果你没有使用Spring开发企业软件,我们热情的推荐你仔细研究一下。 熟悉Spring-尤其是...
Springboot集成spring-security实现基于验证码的登录认证项目_源码
项目中使用到的技术包含SpringBoot、SpringSecurity&oauth2(安全资源和授权中心模式、包括登录接口自定义返回字段、自定义手机号+密码登录、自定义免密登录)、Queue队列、线程池、xss攻击配置、SpringCache、Mybatis...
spring-security-4.2.2.RELEASE相关的jar包和源码。包含核心的认证和连接控制类和接口,用spring security的框架都需要这些。支持单独的应用程序,远程客户端,方法(服务层) 安全和jdbc的基本服务.
本教程是全网最细致地讲解Spring Security、Spring Social 、Spring Security OAuth三种技术开发安全的REST服务,彻底掌握一线互联网公司主流的身份认证和授权方式。 Spring Security是一个能够为基于Spring的企业...
对于每种认证方法,每种认证方法都有一个不同的终结点: 不安全。 普通密码。 摘要密码。 签名。 加密。 所有这些端点都基于相同的结构:带注释的类,用于生成WSDL的XSD文件和简单的模型。 只有实际的Spring...
spring-security-digest 示例 该项目演示了使用 RESTful 服务中的 Java 配置使用 Spring-Security 进行摘要式身份验证的用法 请阅读我在帖子
基于springboot 的 Spring Security 认证定制开发的完整案例实现和执行流程的剖析