安全包括 验证身份和授权,spring对这2部分都进行了支持。
一、基本概念和javase抽象
subject = principal(身份) + credential(凭证)
pricipal的例子:身份证号、用户名、电话号码
credential的例子:密码、证书
Permission:权限
Policy:权限控制策略
AccessController:使用权限
ProtectionDomain:维护了一组身份和权限
加解密:
Cipher 加密服务
MessageDigest 摘要
SecretKey 对称秘钥
PublicKey和PrivateKey 非对称秘钥
KeySpec具体的秘钥的说明
Message Authentication Code (MAC):添加了秘钥的摘要算法
Certificate证书:由发证机构加密过的公钥
签名:(用私钥加密)
Signature signature = Signature.getInstance("SHA1withDSA");
signature.initSign(privateKey);
byte[] data = "Hello World".getBytes();
signature.update(data);
byte[] signatureData = signature.sign(); //得到签名
signature.initVerify(publicKey);
signature.update(data);
boolean result = signature.verify(signatureData); //进行验证
二、spring secure概览
1、基本概念:
UserDetails:安全相关的用户信息
GrantedAuthority[] getAuthorities():用户权限信息
UserDetailsService:loadUserByUsername
Authentication 代表一个和应用程序交互的待认证用户,内部使用UserDetails。
后面的访问控制基于这个类。pricipal + GrantedAuthority
SecurityContext 存储Authentication
SecurityContextHolder 框架层的入口
HttpSession->HttpSessionContextIntegrationFilter
->SecurityContextHolder->SecurityContext ->AuthenticationManager(验证)+AccessDecisionManager(访问控制)
DaoAuthenticationProvider-》UserDetailService
AuthenticationManager: AuthenticationProvider 授权信息注入context
AccessDecisionManager= AccessDecisionVoter(民主投票)
ExceptionTranslationFilter:权限不合适时的异常处理
AuthenticationEntryPoint:登陆入口
2、用户认证过程:
1.你点击一个链接访问一个网页;
2.浏览器发送一个请求到服务器,服务器判断出你正在访问一个受保护的资源;
3.如果此时你并未通过身份认证,服务器发回一个响应提示你进行认证——这个响应可能是一个HTTP响应代码,抑或重定向到一个指定页面;
4.根据系统使用认证机制的不同,浏览器或者重定向到一个登录页面中,或者由浏览器通过一些其它的方式获取你的身份信息(如通过BASIC认证对话框、一 个Cookie或一个X509证书);
5.浏览器再次将用户身份信息发送到服务器上(可能是一个用户登录表单的HTTP POST信息、也可能是包含认证信息的HTTP报文头);
6.服务器判断用户认证信息是否有效,如果无效,一般情况下,浏览器会要求你继续尝试,这意味着返回第3步。如果有效,则到达下一步;
7.服务器重新响应第2步所提交的原始请求,并判断该请求所访问的程序资源是否在你的权限范围内,如果你有权访问,请求将得到正确的执行并返回结果。否 则,你将收到一个HTTP 403错误,这意味着你被禁止访问。
3、访问控制过程:
1. 从SecurityContext中取出已经认证过的Authentication(包括权限信息);
2. 通过反射机制,根据目标安全对象和“配置属性”得到访问目标安全对象所需的权限;
3. AccessDecisionManager根据Authentication的授权信息和目标安全对象所需权限做出是否有权访问的判断。如果无权访问,Acegi将抛出AccessDeniedException异常,否则到下一步;
4. 访问安全对象并获取结果(返回值或HTTP响应);
5.AbstractSecurityInterceptor可以在结果返回前进行处理:更改结果或抛出异常。
三、spring相关jar概览
security-core 用户、token、session等的维护
UserDetailsService TokenService SessionRegistry AbstractAuthenticationToken
security-oauth2 对oauth2的支持
security-config 资源权限的配置
SecurityConfigurer HttpSecurityBuilder
security-web 使用filter等与容器相融合
DefaultRedirectStrategy DefaultSecurityFilterChain
oauth2基本过程:重定向到server、auth、访问token、身份数据插入Spring Security context
四、使用
1、依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、代码
@EnableWebSecurity
默认配置
1、访问应用中的每个URL都需要进行验证
2、生成一个登陆表单
3、允许用户使用username和password来登陆
4、允许用户注销
5、CSRF攻击拦截
6、 Session Fixation攻击
7、 安全Header集成
extends WebSecurityConfigurerAdapter
@Bean
public UserDetailsService userDetailsService() {
return new CustomUserDetailsService();
}
@Bean
public PasswordEncoder passwordEncoder(){
return new Md5PasswordEncoder();
}
@Bean
public AuthenticationProvider authenticationProvider(){
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService());
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//auth.userDetailsService(userDetailsService());
auth.authenticationProvider(authenticationProvider());
}
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**").
// 根据request验证
authorizeRequests()
.antMatchers("/", "/login**", "/webjars/**")
.permitAll()
// 其他的 <intercept-url pattern="/**" access="authenticated"/>
.anyRequest()
.authenticated().and()
.exceptionHandling()
.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/")).and()
// 允许所有人logout
.logout().logoutSuccessUrl("/").permitAll().and()
// csrf支持
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
// 注册sso的filter
.addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
}
五、sso
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
security:
oauth2:
client:
clientId: 233668646673605
clientSecret: 33b17e044ee6a4fa383f46ec6e28ea1d
accessTokenUri: https://graph.facebook.com/oauth/access_token
userAuthorizationUri: https://www.facebook.com/dialog/oauth
tokenName: oauth_token
authenticationScheme: query
clientAuthenticationScheme: form
resource:
userInfoUri: https://graph.facebook.com/me
六、内部实现细节
1、安全在web中使用filter,在app中使用aop,本质是在正常的请求前后加点料
2、@EnableWebSecurity 内部会注入一个springSecurityFilterChain
springSecurityFilterChain内部根据url来配置对应的filter
3、HttpSecurity用来 配置url、filter、对应的权限
4、AuthenticationManagerBuilder 配置验证的方式,比如UserDetailsService、passwordEncoder等
5、sso的实现:添加了一个filter OAuth2ClientAuthenticationProcessingFilter
6、OAuth2ClientAuthenticationProcessingFilter=AuthorizationCodeResourceDetails(获取token)+ResourceServerProperties(获取user信息)
七、附录
oauth2.0过程:
1》client app 向server请求临时令牌
2》获得后,带着临时token去server验证用户名、密码 # auth url
3》验证后server 回调client app获得授权
4》client app用临时token获得 acess token # token url
5》用access token获取用户信息# user url
application.xml中的配置
userAuthorizationUri auth url
accessTokenUri token url
userInfoUri user url
相关推荐
使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth
在本项目中,我们将深入探讨如何利用Spring Security OAuth2和JSON Web Token(JWT)来实现SSO。 一、Spring Security OAuth2 Spring Security 是一个强大的安全框架,提供了一系列用于保护Web应用程序的安全功能...
spring security 基于oauth 2.0 实现 sso 单点登录Demo 使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth
spring boot整合spring security 实现SSO单点登陆 完整DEMO. 1、配置本地hosts 127.0.0.1 sso-login 127.0.0.1 sso-resource 127.0.0.1 sso-tmall 127.0.0.1 sso-taobao windows系统的路径在C:\WINDOWS\system...
内容:完整集成了Spring Gateway, Spring Security, Nacos, OAuth2, RBAC, 手机验证码登录等SSO统一认证平台,全平台唯一,全平台最全,全面细致,已经帮你踩了很多坑,一看就会,可以本地运行,或者直接作为认证...
总的来说,实现Spring Security、Spring OAuth2和Spring MVC的SSO单点登录系统,需要对这些框架有深入理解,并正确配置相应的jar包或Maven/Gradle依赖。通过这个最小化集合,开发者可以快速搭建SSO环境,然后根据...
总的来说,这个“spring-boot spring-security-oauth2 完整demo”为学习和实践Spring Boot、Spring Security与OAuth2的结合提供了宝贵的参考。通过深入理解和实践这个示例,开发者不仅可以掌握这三大框架的基本用法...
前一遍讲的是SSO的简单配置,项目中有时会用到SSO+LoginFrom 两种登录...spring security同样可以实现,在之前SSO的基础上加入FORM_LOGIN_FILTER过滤器即可 http://blog.csdn.net/crazystone4/article/details/51864802
### 单点登录SSO解决方案之SpringSecurity+JWT实现 #### 一、单点登录(SSO)概述 单点登录(Single Sign-On,简称SSO)是一种认证机制,允许用户仅通过一次登录就能访问同一域下的多个应用程序和服务。这种机制...
综上所述,本项目利用Spring Security OAuth2提供的授权框架和JWT的安全特性,构建了一个能够跨应用实现SSO的解决方案。用户只需在首次登录时进行验证,之后在所有支持SSO的应用中都可以无缝切换,提升了用户体验。
4. **会话管理**:Spring Security提供了会话管理功能,可以防止会话固定攻击(Session Fixation)、实现会话超时以及单点登录(Single Sign-On, SSO)。 5. **异常处理**:当安全规则不满足时,Spring Security会...
本文将深入探讨Spring Cloud Security在用户身份认证和权限管理方面的应用,以"spring-cloud-security例子"为基础,结合spring-boot-security-master项目,详细阐述其核心概念和技术实现。 一、用户身份认证 1.1 ...
Spring Security OAuth2 是一个强大的框架,用于保护Java和Spring应用程序的安全。它提供了全面的身份验证和授权服务,可以处理从简单的密码认证到复杂的OAuth2令牌管理的各种需求。在本案例中,我们将探讨如何利用...
在这个"spring security4架包"中,包含了多个核心模块和扩展组件,让我们逐一解析它们的功能和重要性。 1. **spring-security-config-4.1.0.BUILD-SNAPSHOT.jar**:这是Spring Security的核心配置模块,它提供了...
基于 Spring Security 框架和 JWT(JSON Web Token)技术,可以实现 SSO(Single Sign-On)单点登录系统。SSO 是一种常见的身份验证机制,允许用户使用同一个用户名和密码在多个系统中登录。 SSO 的优点: * 提高...
Spring boot+Spring Security Oauth2.0,Sprint cloud+Spring Security Oauth2集成。四种认证方式。附带有代码,和案例,案例,还有视频链接。我保证看完就回,如果视频链接失效,评论回复我,我单独再给你一份。
本案例基于Spring Security OAuth2来实现SSO,这是一个强大的安全框架,结合OAuth2协议,为分布式系统提供了灵活的身份验证和授权解决方案。 首先,Spring Security是Spring生态系统中的一个安全组件,它提供了全面...
概述在本教程中,我们将讨论如何使用Spring Security OAuth和Spring Boot实现单点登录 - 单点登录。我们将使用三个独立的应用程序授权服务器 - 这是中央认证机制两个客户端应用程序:使用SSO的应用程序简而言之,当...
但是在搞一段时间啊后发现自己越走越黑,越走越远,总结下来自己对协议理解还是不够透彻,对之前理解的前后端分离的SSO还是止步于session的交互方式。在涉及到多个域之间换取token还是有一些问题。