- 浏览: 2552496 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
nation:
你好,在部署Mesos+Spark的运行环境时,出现一个现象, ...
Spark(4)Deal with Mesos -
sillycat:
AMAZON Relatedhttps://www.godad ...
AMAZON API Gateway(2)Client Side SSL with NGINX -
sillycat:
sudo usermod -aG docker ec2-use ...
Docker and VirtualBox(1)Set up Shared Disk for Virtual Box -
sillycat:
Every Half an Hour30 * * * * /u ...
Build Home NAS(3)Data Redundancy -
sillycat:
3 List the Cron Job I Have>c ...
Build Home NAS(3)Data Redundancy
springsecurity应用之支持URL传参登陆
项目中使用了spring security来做登陆的安全控制。按照官方文档弄好了。但是最近项目中又出来一个新需求,另外一个系统的用户,
需要用这样的模式来登录本系统:
http://url?username=test&password=test&returnurl=url
在别人的系统中,直接通过这三个参数,到我们的系统来查看某页面,虽然不情愿,但是也没有办法,唉,我们的系统式弱势系统,别人强势。NND。
查看了spring security的文档,同时也参考了一下源码,总算找到个解决方案:
主要查看和参考了源码中的这几个类:
ExceptionTranslationFilter
TargetUrlResolverImpl
AbstractProcessingFilter
AuthenticationProcessingFilter
其中最关键的类
AuthenticationProcessingFilter.java核心方法如下,这个方法主要是负责处理用户名和密码,由于那个强势系统要求传递过来的密码进行了BASE64加密,所以我要在这里BASE64解密一下
所以,我写了一个类似这个Filter的类,配置在配置文件上。
public Authentication attemptAuthentication(HttpServletRequest request) throws AuthenticationException {
String username = obtainUsername(request);
String password = obtainPassword(request);
if (username == null) {
username = "";
}
if (password == null) {
password = "";
}
username = username.trim();
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
HttpSession session = request.getSession(false);
if (session != null || getAllowSessionCreation()) {
request.getSession().setAttribute(SPRING_SECURITY_LAST_USERNAME_KEY, TextUtils.escapeEntities(username));
}
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
配置文件如下:
<beans:bean id="authenticationProcessingFilter"
class="cn.sccl.um.security.CustomerAuthenticationProcessingFilter">
<custom-filter before="AUTHENTICATION_PROCESSING_FILTER" />
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="authenticationFailureUrl" value="/user/login.do" />
<beans:property name="defaultTargetUrl" value="/portal/portal.do" />
<beans:property name="filterProcessesUrl" value="/jspringsecuritycheck.do" />
<beans:property name="usernameParameter" value="${security.username}" />
<beans:property name="passwordParameter" value="${security.password}" />
</beans:bean>
在我的CustomerAuthenticationProcessingFilter类中,和AuthenticationProcessingFilter代码相同,唯一就是加入了
拿到password后,再base64解密一下的代码。
然后跟代码,查看到TargetUrlResolverImpl关键类的核心方法:
public String determineTargetUrl(SavedRequest savedRequest, HttpServletRequest currentRequest,
Authentication auth) {
String targetUrl = currentRequest.getParameter(targetUrlParameter);
if (StringUtils.hasText(targetUrl)) {
try {
return URLDecoder.decode(targetUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("UTF-8 not supported. Shouldn't be possible");
}
}
if (savedRequest != null) {
if (!justUseSavedRequestOnGet || savedRequest.getMethod().equals("GET")) {
targetUrl = savedRequest.getFullRequestUrl();
}
}
return targetUrl;
}
这就是决定登陆成功后,向哪个URL转向滴,一般就是默认配置在defaultTargetUrl里面。如果想自己根据传递过来的URL参数来决定转向页面,
那么这里类TargetUrlResolverImpl中的代码
public static String DEFAULT_TARGET_PARAMETER = "spring-security-redirect";
这就是接受这个URL的参数KEY。
那么最终,我们的URL接口就做成了如下:
http://localhost/jspringsecuritycheck.do?spring-security-redirect=reurl&j_username=test&j_password=MTExMTEx
如果URL参数里面的值有参数的,那么需要urlencode一下,比如形如这样的URL参数
http://localhost/workflow/excuteWorkitem4Oa.do?processInstId=111&name=test&type=1 会urlencode成这样:
http://localhost/workflow/excuteWorkitem4Oa.do?processInstId=111%26name%3Dtest%26type%3D1
项目中使用了spring security来做登陆的安全控制。按照官方文档弄好了。但是最近项目中又出来一个新需求,另外一个系统的用户,
需要用这样的模式来登录本系统:
http://url?username=test&password=test&returnurl=url
在别人的系统中,直接通过这三个参数,到我们的系统来查看某页面,虽然不情愿,但是也没有办法,唉,我们的系统式弱势系统,别人强势。NND。
查看了spring security的文档,同时也参考了一下源码,总算找到个解决方案:
主要查看和参考了源码中的这几个类:
ExceptionTranslationFilter
TargetUrlResolverImpl
AbstractProcessingFilter
AuthenticationProcessingFilter
其中最关键的类
AuthenticationProcessingFilter.java核心方法如下,这个方法主要是负责处理用户名和密码,由于那个强势系统要求传递过来的密码进行了BASE64加密,所以我要在这里BASE64解密一下
所以,我写了一个类似这个Filter的类,配置在配置文件上。
public Authentication attemptAuthentication(HttpServletRequest request) throws AuthenticationException {
String username = obtainUsername(request);
String password = obtainPassword(request);
if (username == null) {
username = "";
}
if (password == null) {
password = "";
}
username = username.trim();
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
HttpSession session = request.getSession(false);
if (session != null || getAllowSessionCreation()) {
request.getSession().setAttribute(SPRING_SECURITY_LAST_USERNAME_KEY, TextUtils.escapeEntities(username));
}
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
配置文件如下:
<beans:bean id="authenticationProcessingFilter"
class="cn.sccl.um.security.CustomerAuthenticationProcessingFilter">
<custom-filter before="AUTHENTICATION_PROCESSING_FILTER" />
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="authenticationFailureUrl" value="/user/login.do" />
<beans:property name="defaultTargetUrl" value="/portal/portal.do" />
<beans:property name="filterProcessesUrl" value="/jspringsecuritycheck.do" />
<beans:property name="usernameParameter" value="${security.username}" />
<beans:property name="passwordParameter" value="${security.password}" />
</beans:bean>
在我的CustomerAuthenticationProcessingFilter类中,和AuthenticationProcessingFilter代码相同,唯一就是加入了
拿到password后,再base64解密一下的代码。
然后跟代码,查看到TargetUrlResolverImpl关键类的核心方法:
public String determineTargetUrl(SavedRequest savedRequest, HttpServletRequest currentRequest,
Authentication auth) {
String targetUrl = currentRequest.getParameter(targetUrlParameter);
if (StringUtils.hasText(targetUrl)) {
try {
return URLDecoder.decode(targetUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("UTF-8 not supported. Shouldn't be possible");
}
}
if (savedRequest != null) {
if (!justUseSavedRequestOnGet || savedRequest.getMethod().equals("GET")) {
targetUrl = savedRequest.getFullRequestUrl();
}
}
return targetUrl;
}
这就是决定登陆成功后,向哪个URL转向滴,一般就是默认配置在defaultTargetUrl里面。如果想自己根据传递过来的URL参数来决定转向页面,
那么这里类TargetUrlResolverImpl中的代码
public static String DEFAULT_TARGET_PARAMETER = "spring-security-redirect";
这就是接受这个URL的参数KEY。
那么最终,我们的URL接口就做成了如下:
http://localhost/jspringsecuritycheck.do?spring-security-redirect=reurl&j_username=test&j_password=MTExMTEx
如果URL参数里面的值有参数的,那么需要urlencode一下,比如形如这样的URL参数
http://localhost/workflow/excuteWorkitem4Oa.do?processInstId=111&name=test&type=1 会urlencode成这样:
http://localhost/workflow/excuteWorkitem4Oa.do?processInstId=111%26name%3Dtest%26type%3D1
发表评论
-
Update Site will come soon
2021-06-02 04:10 1679I am still keep notes my tech n ... -
Portainer 2020(4)Deploy Nginx and Others
2020-03-20 12:06 431Portainer 2020(4)Deploy Nginx a ... -
Private Registry 2020(1)No auth in registry Nginx AUTH for UI
2020-03-18 00:56 436Private Registry 2020(1)No auth ... -
Docker Compose 2020(1)Installation and Basic
2020-03-15 08:10 374Docker Compose 2020(1)Installat ... -
VPN Server 2020(2)Docker on CentOS in Ubuntu
2020-03-02 08:04 456VPN Server 2020(2)Docker on Cen ... -
Nginx Deal with OPTIONS in HTTP Protocol
2020-02-15 01:33 356Nginx Deal with OPTIONS in HTTP ... -
PDF to HTML 2020(1)pdftohtml Linux tool or PDFBox
2020-01-29 07:37 405PDF to HTML 2020(1)pdftohtml Li ... -
Elasticsearch Cluster 2019(2)Kibana Issue or Upgrade
2020-01-12 03:25 720Elasticsearch Cluster 2019(2)Ki ... -
Spark Streaming 2020(1)Investigation
2020-01-08 07:19 295Spark Streaming 2020(1)Investig ... -
Hadoop Docker 2019 Version 3.2.1
2019-12-10 07:39 295Hadoop Docker 2019 Version 3.2. ... -
MongoDB 2019(3)Security and Auth
2019-11-16 06:48 241MongoDB 2019(3)Security and Aut ... -
MongoDB 2019(1)Install 4.2.1 Single and Cluster
2019-11-11 05:07 294MongoDB 2019(1) Follow this ht ... -
Monitor Tool 2019(1)Monit Installation and Usage
2019-10-17 08:22 325Monitor Tool 2019(1)Monit Insta ... -
Ansible 2019(1)Introduction and Installation on Ubuntu and CentOS
2019-10-12 06:15 312Ansible 2019(1)Introduction and ... -
Timezone and Time on All Servers and Docker Containers
2019-10-10 11:18 332Timezone and Time on All Server ... -
Kafka Cluster 2019(6) 3 Nodes Cluster on CentOS7
2019-10-05 23:28 283Kafka Cluster 2019(6) 3 Nodes C ... -
K8S Helm(1)Understand YAML and Kubectl Pod and Deployment
2019-10-01 01:21 326K8S Helm(1)Understand YAML and ... -
Rancher and k8s 2019(5)Private Registry
2019-09-27 03:25 362Rancher and k8s 2019(5)Private ... -
Jenkins 2019 Cluster(1)Version 2.194
2019-09-12 02:53 444Jenkins 2019 Cluster(1)Version ... -
Redis Cluster 2019(3)Redis Cluster on CentOS
2019-08-17 04:07 373Redis Cluster 2019(3)Redis Clus ...
相关推荐
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。在这个场景中,我们关注的是如何使用Spring Security实现登录验证以及在登录过程中传递参数,特别是记录并返回用户登录前的...
Spring Security如何使用URL地址进行权限控制 Spring Security是一个功能强大且广泛应用的Java安全框架,它提供了许多功能,包括身份验证、授权、加密等。其中,权限控制是Spring Security的一个重要组件,它允许...
* 广泛的应用场景:Spring Security 可以应用于多种应用场景,例如 web 应用、后台服务等。 * 高度可配置性:Spring Security 的配置项非常灵活,可以根据实际需求进行配置。 Spring Security 是一个功能强大且灵活...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...
Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中,我们将深入探讨Spring Security的核心概念以及如何将其应用于实际的Web应用程序开发。 首先,我们从用户、...
SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话管理以及安全相关的功能,可以帮助开发者构建安全的Web应用。在本笔记中,我们将深入探讨Spring...
Spring Security之所以在Java社区中广泛流行,是因为它不仅提供了强大的安全特性,还具有高可定制性、良好的扩展性和兼容性,使得开发者可以根据具体需求选择合适的安全解决方案。而随着Web应用程序的安全要求越来越...
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、授权和访问控制功能。在本文中,我们将深入探讨SpringSecurity的核心概念、关键组件以及如何配置和使用这个框架。 首先,Spring...
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。在Spring Security 3.0.5版本中,它提供了许多关键的安全特性,包括用户认证、权限控制、CSRF防护、会话管理等。这个版本是...
### Spring Security 概述与应用实践 #### 一、引言 在当今互联网时代,网络安全问题日益凸显,尤其是Web应用程序的安全性受到了前所未有的关注。为了应对这些挑战,Spring Security 应运而生,成为了一个非常重要...
SpringSecurity是Java领域中一款强大的安全框架,广泛用于构建安全的Web应用。它提供了一整套解决方案,包括认证、授权、会话管理以及防止常见攻击等。本教程将基于IntelliJ IDEA(IDEA)和SpringBoot来详细介绍如何...
### Spring Security 3.0.1 中文版知识点解析...通过上述知识点的介绍,我们了解了 Spring Security 的核心概念、配置方式以及一些高级特性,这有助于开发者更好地利用 Spring Security 为应用程序构建强大的安全防护。
在IT行业中,SpringBoot、SpringSecurity和WebSocket是三个非常重要的技术组件,它们分别在应用程序开发、安全管理和实时通信方面发挥着关键作用。本项目结合这三个技术,构建了一个整合的示例,旨在展示如何在...
- 如果应用使用 JPA(Java Persistence API)作为数据访问技术,Spring Security 可以与之集成,通过 `UserDetailsService` 接口来查询用户信息和权限。 9. **摘要认证**: - 摘要认证是一种常见的身份验证方式,...
- **安全web请求的架构**:Spring Security采用拦截器链(Filter Chain)模型来处理请求,每个请求都会经过一系列的过滤器,直到找到匹配的URL模式为止。 #### 三、增强用户体验 - **自定义登录页**:允许开发者...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它提供了全面的安全解决方案,包括用户认证、权限授权、会话管理、CSRF防护以及基于HTTP的访问控制。在这个例子中,我们将...
SpringSecurity是Java领域中一款强大的安全框架,专为Spring和Spring Boot应用设计,提供全面的安全管理解决方案。在SpringBoot Web开发中,SpringSecurity扮演着核心角色,负责处理身份验证、授权以及访问控制等...