`
sillycat
  • 浏览: 2499302 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

springsecurity应用之支持URL传参登陆

    博客分类:
  • JAVA
阅读更多
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
分享到:
评论

相关推荐

    springSecurity 实现传参

    springSecurity 实现登陆验证、传参,包括源代码和MYSQL的建库脚本。 传参的功能可以实现记录登陆之前打开的页面,登陆之后自动跳转到之前打开的页面。

    Spring Security如何使用URL地址进行权限控制

    主要介绍了Spring Security如何使用URL地址进行权限控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Spring Security 资料合集

    Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf

    精彩:Spring Security 演讲PPT

    Spring Security 演讲PPT(演讲嘉宾:张明星) WebSphere技术专家沙龙在广州圆满举办,WSC超级版主Fastzch(张明星)担任本次沙龙的演讲嘉宾,他给广州的WebSphere技术专家带来了以“Spring Security ”为主题的...

    spring security spring security

    spring security spring security 中文文档

    SpringSecurity项目

    springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以满足定制需求。 spring security 的核心功能主要包括: 认证 (你是...

    Spring Security in Action

    Spring Security in Action

    SpringSecurity.zip

    ​ Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...

    spring security4登陆例子

    spring security4登陆

    springsecurity原理流程图.pdf

    SpringSecurity框架的权限认证流程原理,请求到来时SpringSecurity如果调用层层过滤器来完成认证;

    Spring Security 2 中文 CHM版

    自己在网络上看到并整理成CHM版本的。 原地址:http://www.family168.com/tutorial/springsecurity/html/springsecurity.html

    Spring Security实战源码

    该资源是基本Spring Security实战七篇文档中组织的源码,详情如下: ssecurity项目是Spring Security实战(一和二)的源码; ssecurity-db项目是Spring Security实战(三)的源码; ssceurity-page项目是Spring ...

    Spring Security应用实践,整合redis缓存

    小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。 一般Web应用的需要进行认证和授权。 ​认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户 ​授权:经过认证后...

    springsecurity学习笔记

    三更springsecurity学习笔记

    微信扫一扫登录、微信支付、springsecurity&oauth2

    项目中使用到的技术包含SpringBoot、SpringSecurity&oauth2(安全资源和授权中心模式、包括登录接口自定义返回字段、自定义手机号+密码登录、自定义免密登录)、Queue队列、线程池、xss攻击配置、SpringCache、Mybatis...

    Spring Security 3.pdf

    Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf

    SpringSecurity学习总结源代码

    SpringSecurity学习总结源代码

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    1.本项目为SpringCloud Gateway的微服务框架,整合了SpringSecurity,微服务间使用Redis来获取登陆的用户信息。 2.由于Gat

    SpringSecurity.pdf

    SpringSecurity入门到进阶到高级,是我们老师给我们讲课用的,我们都照着配就没有问题,可以跑通,

    Spring Security API(Spring Security 开发文档).CHM

    Spring Security。 官网 Spring Security API(Spring Security 开发文档).CHM

Global site tag (gtag.js) - Google Analytics