模拟springmvc 内部登陆,跳过spring filter
说明,因为我们的一个项目B使用spring mvc配置的登陆框架,所以对登陆控制全部交给了spring,导致我们如果想通过另一个项目A登陆到项目B就不太容易,具体是项目A登陆了,我们通过一个连接直接跳转到项目B,
前提,项目A用户名密码和项目B的用户名密码必须是一样的
难点:1.项目A用密文登陆,即前端JS对密码加密后传递给后天,但是项目B是明文直接传递给spring框架
思路:我开始通过debug往spring的代码里面寻求突破点,但是找了好长时间,发现跳转太多,不好找。后来,仔细想想,spring能通过什么来保存数据呢,当然是session啦
于是,就有下面的代码:
Set keySet = (Set)session.keySet();
Object val = null;
SecurityContextImpl securityContext = null;
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = null;
for(Object key : keySet){
val = session.get(key);
if(val != null){
securityContext = (SecurityContextImpl) val; //1. SecurityContextImpl
System.out.println(securityContext.getAuthentication());
usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) securityContext.getAuthentication();//2. UsernamePasswordAuthenticationToken System.out.println(JSONUtils.toJSONString(usernamePasswordAuthenticationToken));
String credentials = usernamePasswordAuthenticationToken.getCredentials()+""; //3.Credentials
if(credentials != null){
System.out.println("credentials============"+credentials);//通过直接打印可以发现该对象对应的实体
System.out.println(credentials);
}
Object principal = usernamePasswordAuthenticationToken.getPrincipal();
if(principal != null){
System.out.println("principal============"+principal);//通过直接打印可以发现该对象对应的实体
System.out.println(JSONUtils.toJSONString(principal));//通过json输出可以查看该对象中的具体属性值
}
List<GrantedAuthority> grantedAuthorities = (List<GrantedAuthority>)usernamePasswordAuthenticationToken.getAuthorities();
if(grantedAuthorities != null){
System.out.println("List<GrantedAuthority>============"+grantedAuthorities);//通过直接打印可以发现该对象对应的实体
System.out.println(JSONUtils.toJSONString(grantedAuthorities));
}
}
}
通过查看所有的get方法,找到所有内部实体,然后在新模拟的登陆方法中生成这些对象
package com.rainsoft.services.index.action; import com.rainsoft.common.utils.JSONUtils;
import com.rainsoft.framework.web.struts2.SimpleActionSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class ThirdLoginAction extends SimpleActionSupport { private static final Log logger = LogFactory.getLog(ThirdLoginAction.class); @Resource
private DaoAuthenticationProvider daoAuthenticationProvider;
@Resource
private UserDetailsService userDetailServiceImpl; private SecurityContextImpl securityContextImpl;
/**
*
* 方法功能说明:第三方登陆接口
* @throws IOException
* @date 2017/01/06 10:54:54
*/
public void login() throws Exception {
String userName = request.getParameter("username");
String password = request.getParameter("password");
/*Users user = new Users();
user.setName(userName);
user.setPassword(password);*/ //认证信息,即明文密码,
String credentials = password; //3.Credentials
if(credentials != null){
System.out.println("credentials============");
System.out.println(credentials);
}
// //用户对象 principal============com.rainsoft.framework.entity.Users@a8833b7b
UserDetails principal = userDetailServiceImpl.loadUserByUsername(userName);
if(principal != null){
System.out.println("principal============");
System.out.println(JSONUtils.toJSONString(principal));
}
//用户角色
List<GrantedAuthority> grantedAuthorities =new ArrayList<GrantedAuthority>();
if(grantedAuthorities != null){
GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_USERS");
grantedAuthorities.add(grantedAuthority);
} UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(principal,password,grantedAuthorities);
securityContextImpl = (SecurityContextImpl) SecurityContextHolder.getContext();
securityContextImpl.setAuthentication(usernamePasswordAuthenticationToken); session.put("SPRING_SECURITY_CONTEXT",securityContextImpl); response.sendRedirect(request.getContextPath()+"/main!fmpg.do"); }
}
通过上面的代码,我们就可以直接进入系统B,然后操作相应的菜单,以上只是我的个人理解,如果路过的童鞋们有更好的方法,希望不吝赐教
模拟springmvc 内部登陆,跳过spring filter的更多相关文章
- spring filter过滤器
1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...
- SpringMVC从Controller跳转到另一个Controller(转)
http://blog.csdn.net/jackpk/article/details/44117603 [PK亲测] 能正常跳转的写法如下: return "forward:aaaa/bb ...
- springMVC controller间跳转 重定向 传递参数的方法
springMVC controller间跳转 重定向 传递参数的方法 spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参 ...
- [PHP自动化-进阶]004.Snoopy VS CURL 模拟Discuz.net登陆
引言:采集论坛第一步就是要模拟登陆,由于各个站点登录表单各不相同,验证方式又是多种多样,所以直接提交用户名密码到登录页面就比较繁琐. 所以我们采用cookie来模拟登陆无疑是最佳捷径. 今天我们要处理 ...
- SpringMVC实现客户端跳转
之前无论是/index跳转到index.jsp 还是/addProduct 跳转到showProduct.jsp,都是服务端跳转. 这一篇练习如何进行客户端跳转 @ 目录 修改IndexControl ...
- web应用怎么跳过某些Filter
在做的项目需要用到cas,而使用cas的话,需要在client的webapp的web.xml中配置好多个filter,但是需要兼容到老的逻辑,如果满足某些条件,就不走cas的filter,满足另外一些 ...
- [模拟回调] demo1模拟用字符串调用js函数 demo2模拟springmvc controller回调页面js函数
demo1. 模拟用字符串调用js 函数 function dataQuery() { var strFun = "testCallBack"; var strParam = &q ...
- Spring Filter过滤表单中的非法字符
使用Spring Filter过滤表单中的非法字符 1 package test.filter; 2 3 import java.io.IOException; 4 import java.util. ...
- Ajax登陆,使用Spring Security缓存跳转到登陆前的链接
Spring Security缓存的应用之登陆后跳转到登录前源地址 什么意思? 用户访问网站,打开了一个链接:(origin url)起源链接 请求发送给服务器,服务器判断用户请求了受保护的资源. 由 ...
随机推荐
- MapReduce Shuffle And Sort
引言 MapReduce作出保证:进入每个Reducer的数据行都是有序的(根据数据行的键值进行排序).MapReduce将Mapper的输出进行排序并传递给Reducer作为输入的过程称为Shu ...
- //string scriptstrs = "<script>alert('欢迎光临!');</script>";
//string scriptstrs = "<script>alert('欢迎光临!');</script>"; //if (!Page.ClientSc ...
- HDU_1429——胜利大逃亡续,十位二进制状态压缩,状态判重
Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁 ...
- Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
按教程,使用Convention插件进行配置 教程中说只要加入struts2-convention-plugin-2.3.4.1.jar这个jar包就可以使用. 按照这种方法部署后,启动tomcat报 ...
- Java web App 部署静态文件
以 Tomcat 为例子,静态文件,如 html, css, js ,无需编译,所以只需要把文件复制到 Tomcat/webapps 目录下面某个子目录,便可以了. 例子: 1. 在 Tomcat/w ...
- 大规模Hadoop集群在腾讯数据仓库TDW的实践
随着业务的快速增长,TDW的节点数也在增加,对单个大规模Hadoop集群的需求也越来越强烈.TDW需要做单个大规模集群,主要是从数据共享.计算资源共享.减轻运营负担和成本等三个方面考虑. 数据共享.T ...
- [Angular 2] Child Router
Benefit to use child router is Angualr 2 then can lazy load the component on demand. Define a child ...
- jQuery 對table的基本操作
一.鼠标移动到行更换背景色: css样式: .hover{ background-color: #cccc00; } Js脚本: $(document).ready(function () { //鼠 ...
- intellij安装Scala及Python插件
1.下载intellij及Scala和Python插件 intellij的下载地址:https://www.jetbrains.com/idea/download/#section=windows S ...
- Linux shell入门基础(一)
Linux shell入门基础(一): 01.增加删除用户: #useradd byf userdel byf(主目录未删除) userdel -r byf 该用户的属性:usermod 用 ...