`
eric_weitm
  • 浏览: 242204 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring4 系列五 security 和sso

 
阅读更多

安全包括 验证身份和授权,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 实现 sso 单点登录Demo

    使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth

    spring security oauth2 实现jwt sso

    在本项目中,我们将深入探讨如何利用Spring Security OAuth2和JSON Web Token(JWT)来实现SSO。 一、Spring Security OAuth2 Spring Security 是一个强大的安全框架,提供了一系列用于保护Web应用程序的安全功能...

    spring security 基于oauth 2.0 实现 sso 单点登录Demo.zip

    spring security 基于oauth 2.0 实现 sso 单点登录Demo 使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth

    spring boot 实现SSO单点登陆

    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+Security+OAuth2+RBAC 实现SSO统一认证平台

    内容:完整集成了Spring Gateway, Spring Security, Nacos, OAuth2, RBAC, 手机验证码登录等SSO统一认证平台,全平台唯一,全平台最全,全面细致,已经帮你踩了很多坑,一看就会,可以本地运行,或者直接作为认证...

    spring security + spring oauth2 +spring mvc SSO单点登录需要的最小jar包集合

    总的来说,实现Spring Security、Spring OAuth2和Spring MVC的SSO单点登录系统,需要对这些框架有深入理解,并正确配置相应的jar包或Maven/Gradle依赖。通过这个最小化集合,开发者可以快速搭建SSO环境,然后根据...

    spring-boot spring-security-oauth2 完整demo

    总的来说,这个“spring-boot spring-security-oauth2 完整demo”为学习和实践Spring Boot、Spring Security与OAuth2的结合提供了宝贵的参考。通过深入理解和实践这个示例,开发者不仅可以掌握这三大框架的基本用法...

    Spring Security4 SSO和Form两种认证配置

    前一遍讲的是SSO的简单配置,项目中有时会用到SSO+LoginFrom 两种登录...spring security同样可以实现,在之前SSO的基础上加入FORM_LOGIN_FILTER过滤器即可 http://blog.csdn.net/crazystone4/article/details/51864802

    单点登录SSO解决方案之SpringSecurity+JWT实现.docx

    ### 单点登录SSO解决方案之SpringSecurity+JWT实现 #### 一、单点登录(SSO)概述 单点登录(Single Sign-On,简称SSO)是一种认证机制,允许用户仅通过一次登录就能访问同一域下的多个应用程序和服务。这种机制...

    spring security oauth2以及jwt实现sso单点登陆的功能

    综上所述,本项目利用Spring Security OAuth2提供的授权框架和JWT的安全特性,构建了一个能够跨应用实现SSO的解决方案。用户只需在首次登录时进行验证,之后在所有支持SSO的应用中都可以无缝切换,提升了用户体验。

    spring spring security2.5 jar

    4. **会话管理**:Spring Security提供了会话管理功能,可以防止会话固定攻击(Session Fixation)、实现会话超时以及单点登录(Single Sign-On, SSO)。 5. **异常处理**:当安全规则不满足时,Spring Security会...

    spring-cloud-security例子

    本文将深入探讨Spring Cloud Security在用户身份认证和权限管理方面的应用,以"spring-cloud-security例子"为基础,结合spring-boot-security-master项目,详细阐述其核心概念和技术实现。 一、用户身份认证 1.1 ...

    spring security oauth2 实现的SSO单点登录案例.rar

    Spring Security OAuth2 是一个强大的框架,用于保护Java和Spring应用程序的安全。它提供了全面的身份验证和授权服务,可以处理从简单的密码认证到复杂的OAuth2令牌管理的各种需求。在本案例中,我们将探讨如何利用...

    spring security4架包

    在这个"spring security4架包"中,包含了多个核心模块和扩展组件,让我们逐一解析它们的功能和重要性。 1. **spring-security-config-4.1.0.BUILD-SNAPSHOT.jar**:这是Spring Security的核心配置模块,它提供了...

    Spring Security基于JWT实现SSO单点登录详解

    基于 Spring Security 框架和 JWT(JSON Web Token)技术,可以实现 SSO(Single Sign-On)单点登录系统。SSO 是一种常见的身份验证机制,允许用户使用同一个用户名和密码在多个系统中登录。 SSO 的优点: * 提高...

    Spring Security Oauth2.0认证授权专题

    Spring boot+Spring Security Oauth2.0,Sprint cloud+Spring Security Oauth2集成。四种认证方式。附带有代码,和案例,案例,还有视频链接。我保证看完就回,如果视频链接失效,评论回复我,我单独再给你一份。

    基于oauth2+security实现的SSO单点登录案例

    本案例基于Spring Security OAuth2来实现SSO,这是一个强大的安全框架,结合OAuth2协议,为分布式系统提供了灵活的身份验证和授权解决方案。 首先,Spring Security是Spring生态系统中的一个安全组件,它提供了全面...

    spring-security-sso:简单的单点登录Spring Security OAuth2

    概述在本教程中,我们将讨论如何使用Spring Security OAuth和Spring Boot实现单点登录 - 单点登录。我们将使用三个独立的应用程序授权服务器 - 这是中央认证机制两个客户端应用程序:使用SSO的应用程序简而言之,当...

    SpringSecurity+OAuth2+SSO.pptx

    但是在搞一段时间啊后发现自己越走越黑,越走越远,总结下来自己对协议理解还是不够透彻,对之前理解的前后端分离的SSO还是止步于session的交互方式。在涉及到多个域之间换取token还是有一些问题。

Global site tag (gtag.js) - Google Analytics