Skip to content

Commit

Permalink
使用单点登录实现相同域名下免密码登录
Browse files Browse the repository at this point in the history
fix #59
close #59
  • Loading branch information
yankj12 committed Mar 14, 2018
1 parent 254eb5a commit d71d968
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 71 deletions.
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,11 @@
<version>1.2</version>
</dependency>

<dependency>
<groupId>com.yan</groupId>
<artifactId>sso-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

<build>
Expand Down
152 changes: 99 additions & 53 deletions src/main/java/com/yan/access/action/LoginAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.yan.access.dao.UserMongoDaoUtil;
import com.yan.access.model.User;
import com.yan.access.service.facade.UserAccessService;
import com.yan.access.vo.ResponseVo;
import com.yan.access.vo.UserMsgInfo;

public class LoginAction extends ActionSupport{
Expand All @@ -32,6 +33,8 @@ public class LoginAction extends ActionSupport{

private UserMongoDaoUtil userMongoDaoUtil;

private UserAccessService userAccessService;

private UserMsgInfo userMsgInfo;

public String prepareLogin(){
Expand All @@ -47,17 +50,40 @@ public String login(){
//获取Session对象
//获取sessionid
HttpServletRequest request = ServletActionContext.getRequest();
String ip = request.getRemoteAddr();
//String ip = request.getRemoteAddr();

HttpSession httpSession = request.getSession();
//HttpSession httpSession = request.getSession();
String sessID = request.getSession().getId();

if(httpSession != null){
if(httpSession.getAttribute(sessID) != null){
userMsgInfo = (UserMsgInfo)httpSession.getAttribute(sessID);
// find tickets from cookies
String ticket = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("ticket".equals(name)) {
ticket = cookie.getValue();
break;
}
}
}
if(ticket == null || "".equals(ticket)) {
ticket = sessID;
}

try {
// 先检查下session中是否存在tickets
ResponseVo responseVo = userAccessService.getSession(ticket);

if(responseVo != null && responseVo.isSuccess()){
userMsgInfo = responseVo.getUserMsgInfo();

String userCode = userMsgInfo.getUserCode();
errorMsg = null;
return "success";
}else{
// 如果ticket不存在登陆记录,那么我们应该讲ticket更新成新的,否则就会出现一个ticket一直用的情况
ticket = sessID;
//根据用户名密码进行登录
if(userCode == null || password == null
|| "".equals(userCode.trim()) || "".equals(password.trim())){
Expand All @@ -68,62 +94,74 @@ public String login(){
}
String passwordMD5 = DigestUtils.md5Hex(password);

Map<String, Object> map = new HashMap<String, Object>();
map.put("userCode", userCode);
map.put("pswd", passwordMD5);
map.put("validStatus", "1"); //只查询有效用户
map.put("auditStatus", "2"); //只查询审批通过用户


List<User> users = userMongoDaoUtil.findUserDocumentsByCondition(map);

User user = null;
if(users != null && users.size() == 1){
user = users.get(0);
try {
ResponseVo responseVo2 = userAccessService.checkUserAuth(userCode, passwordMD5, ticket);
if(responseVo2 != null && responseVo2.isSuccess()) {
success = true;
//errorMsg = "用户名或密码不正确!";
errorMsg = responseVo2.getErrorMsg();
userMsgInfo = responseVo2.getUserMsgInfo();

// 将tickets写入到父级域名的cookie中
// put tickets in cookie
Cookie ticketsCookie = new Cookie("ticket", ticket);
ticketsCookie.setPath("/");
ServletActionContext.getResponse().addCookie(ticketsCookie);

return "success";
}else {
success = false;
//errorMsg = "用户名或密码不正确!";
errorMsg = responseVo.getErrorMsg();
return "login";
}
} catch (Exception e) {
e.printStackTrace();
errorMsg = e.getMessage();
}
success = false;
//errorMsg = "用户名或密码不正确!";

//根据userCode和password去库里查
//User user = userService.findUserByPK(userCode);

//查到有数据,则向session中加入
if(user != null){
userMsgInfo = new UserMsgInfo();
userMsgInfo.setUserCode(user.getUserCode());
userMsgInfo.setUserCName(user.getUserName());
userMsgInfo.setEmail(user.getEmail());
//userMsgInfo.setTeamCode(user.getTeam());
userMsgInfo.setIp(ip);

httpSession.setAttribute(sessID, userMsgInfo);

return "success";
}else{
//没有查到数据,则跳转到登陆界面
errorMsg = "用户名或密码不正确!";

return "login";
}
}
return "login";
}
} catch (Exception e) {
e.printStackTrace();
errorMsg = e.getMessage();
}

return "success";
// 缺省的是进入登录界面
return "login";
}

public String logout(){
HttpServletRequest request = ServletActionContext.getRequest();
String ip = request.getRemoteAddr();
HttpSession httpSession = request.getSession();
String sessID = request.getSession().getId();
//从session中获取userCode
if(httpSession != null){
if(httpSession.getAttribute(sessID) != null){
userMsgInfo = (UserMsgInfo)httpSession.getAttribute(sessID);
if(userMsgInfo != null && userMsgInfo.getUserCode() != null){
userCode = userMsgInfo.getUserCode().trim();
}

// find tickets from cookies
String ticket = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("ticket".equals(name)) {
ticket = cookie.getValue();
break;
}
}
}
if(ticket == null || "".equals(ticket)) {
ticket = sessID;
}

try {
ResponseVo responseVo = userAccessService.invalidateSession(ticket);
if(responseVo.isSuccess()) {

}else {

}
} catch (Exception e) {
e.printStackTrace();
}
httpSession.removeAttribute(sessID);

return "login";
}
Expand Down Expand Up @@ -312,5 +350,13 @@ public UserMongoDaoUtil getUserMongoDaoUtil() {
public void setUserMongoDaoUtil(UserMongoDaoUtil userMongoDaoUtil) {
this.userMongoDaoUtil = userMongoDaoUtil;
}

public UserAccessService getUserAccessService() {
return userAccessService;
}

public void setUserAccessService(UserAccessService userAccessService) {
this.userAccessService = userAccessService;
}

}
37 changes: 31 additions & 6 deletions src/main/java/com/yan/access/filter/LoginFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.opensymphony.xwork2.ActionContext;
import com.yan.access.service.facade.UserAccessService;
import com.yan.access.service.impl.UserAccessServiceImpl;
import com.yan.access.vo.ResponseVo;
import com.yan.access.vo.UserMsgInfo;

public class LoginFilter implements Filter{
Expand Down Expand Up @@ -43,6 +47,8 @@ public void doFilter(ServletRequest request, ServletResponse response,
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpSession httpSession = servletRequest.getSession();

UserAccessService userAccessService = new UserAccessServiceImpl();

// 获得用户请求的URI
String uri = servletRequest.getRequestURI();

Expand Down Expand Up @@ -87,14 +93,33 @@ public void doFilter(ServletRequest request, ServletResponse response,
String contextPath = servletRequest.getContextPath();

boolean isUserLogin = false;
if(httpSession != null){
String sessID = httpSession.getId();
if(httpSession.getAttribute(sessID) != null){
UserMsgInfo userMsgInfo = (UserMsgInfo)httpSession.getAttribute(sessID);
servletRequest.setAttribute("userMsgInfo", userMsgInfo);
String userCode = userMsgInfo.getUserCode();
String sessID = httpSession.getId();

// find tickets from cookies
String ticket = null;
Cookie[] cookies = servletRequest.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("ticket".equals(name)) {
ticket = cookie.getValue();
break;
}
}
}
if(ticket == null || "".equals(ticket)) {
ticket = sessID;
}

try {
ResponseVo responseVo = userAccessService.getSession(ticket);
if(responseVo != null && responseVo.isSuccess()) {
isUserLogin = true;
}else {
isUserLogin = false;
}
} catch (Exception e) {
e.printStackTrace();
}

if(isUserLogin){
Expand Down
14 changes: 8 additions & 6 deletions src/main/resources/applicationContext.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
</bean>

<bean id="dataSource" class="com.yan.common.mongodb.MongoDBConfig">
<property name="ip" value="${ip}" />
<property name="port" value="${port}" />
<property name="database" value="${database}" />
<property name="dbUserDefined" value="${dbUserDefined}" />
<property name="user" value="${user}" />
<property name="password" value="${password}" />
<property name="ip" value="${mongodb.ip}" />
<property name="port" value="${mongodb.port}" />
<property name="database" value="${mongodb.database}" />
<property name="dbUserDefined" value="${mongodb.dbUserDefined}" />
<property name="user" value="${mongodb.user}" />
<property name="password" value="${mongodb.password}" />
</bean>

<bean id="emailConfig" class="com.yan.mail.common.EmailConfig">
Expand Down Expand Up @@ -105,4 +105,6 @@
</property>
</bean>

<bean id="userAccessService" class="com.yan.access.service.impl.UserAccessServiceImpl">
</bean>
</beans>
13 changes: 7 additions & 6 deletions src/main/resources/db.properties.example
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@

# mongodb
ip=localhost
port=27017
# key must start with prefix 'mongodb.' or it will mixed with redis.ip
mongodb.ip=localhost
mongodb.port=27017
# database is the database which to connecte
database=test
mongodb.database=test
# dbUserDefined is the name of the database in which the user is defined
dbUserDefined=teste
user=test
password=test
mongodb.dbUserDefined=teste
mongodb.user=test
mongodb.password=test

0 comments on commit d71d968

Please sign in to comment.