Spring-Security笔记9 自定义登录成功后的处理程序及修改默认验证地址
2018-03-01 16:24
627 查看
form-login配置中的authentication-success-handler-ref可以让手动注入登录成功后的处理程序,需要实现AuthenticationSuccessHandler接口。
登录成功之后的相关业务逻辑都可以写这个handler方法中,而不应该在login.do这种方法里写。login.do应该仅处理验证登录、权限获取。登录成功之后,使用handler来进行相关业务初始化操作。
先看配置:<!-- 登录表单设置 -->
<!-- login-page:登录页面 -->
<!-- login-processing-url:自定义的登录提交action名称,需要与登录form中的action保持一致 -->
<!-- authentication-failure-url:登录失败后跳转的页面 -->
<!-- default-target-url:登录成功后跳转的页面,如果配置了authentication-success-handler-ref则不生效 -->
<!-- username-parameter:登录用户名的参数名称,需要与登录form中的input name='username'保持一致 -->
<!-- password-parameter:登录密码的参数名称,需要与登录form中的input name='password'保持一致 -->
<!-- authentication-success-handler-ref:自定义登录成功后的Handler -->
<sec:form-login login-page="/toLogin.do"
login-processing-url="/login.do" authentication-failure-url="/toLogin.do?message=authentication-failure"
authentication-success-handler-ref="customLoginSuccessHandler"
username-parameter="username" password-parameter="password" />
自定义的successHandlerpackage com.fhzz.core.sercurity.handler;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.fhzz.core.sercurity.dao.SysUsersDao;
import com.fhzz.core.sercurity.entity.SysUsers;
import com.fhzz.core.utils.HTTPUtils;
/**
* @author YangYi
*
*/
@Service
public class CustomLoginSuccessHandler implements AuthenticationSuccessHandler {
Log logger = LogFactory.getLog(CustomLoginSuccessHandler.class);
@Value("/toIndex.do")
private String defaultTargetUrl;
@Autowired
private SysUsersDao sysUsersDao;
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
this.saveLoginInfo(request, authentication);
logger.info("登录成功,即将forward:" + this.defaultTargetUrl);
// 登录成功之后将SECURITY放入上下文中
request.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());
request.getRequestDispatcher(this.defaultTargetUrl).forward(request, response);
}
private void saveLoginInfo(HttpServletRequest request, Authentication authentication) {
SysUsers user = (SysUsers) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String ip = HTTPUtils.getIpAddress(request);
user.setLastLogin(new Date());
user.setLoginIp(ip);
logger.info("登录用户:" + user);
this.sysUsersDao.saveOrUpdateSysUser(user);
}
}这个handler 以记录用户登录信息为例,实现了onAuthenticationSuccess方法
实际上这里可以做任何应该与用户一同初始化的工作
登录成功之后的相关业务逻辑都可以写这个handler方法中,而不应该在login.do这种方法里写。login.do应该仅处理验证登录、权限获取。登录成功之后,使用handler来进行相关业务初始化操作。
先看配置:<!-- 登录表单设置 -->
<!-- login-page:登录页面 -->
<!-- login-processing-url:自定义的登录提交action名称,需要与登录form中的action保持一致 -->
<!-- authentication-failure-url:登录失败后跳转的页面 -->
<!-- default-target-url:登录成功后跳转的页面,如果配置了authentication-success-handler-ref则不生效 -->
<!-- username-parameter:登录用户名的参数名称,需要与登录form中的input name='username'保持一致 -->
<!-- password-parameter:登录密码的参数名称,需要与登录form中的input name='password'保持一致 -->
<!-- authentication-success-handler-ref:自定义登录成功后的Handler -->
<sec:form-login login-page="/toLogin.do"
login-processing-url="/login.do" authentication-failure-url="/toLogin.do?message=authentication-failure"
authentication-success-handler-ref="customLoginSuccessHandler"
username-parameter="username" password-parameter="password" />
自定义的successHandlerpackage com.fhzz.core.sercurity.handler;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.fhzz.core.sercurity.dao.SysUsersDao;
import com.fhzz.core.sercurity.entity.SysUsers;
import com.fhzz.core.utils.HTTPUtils;
/**
* @author YangYi
*
*/
@Service
public class CustomLoginSuccessHandler implements AuthenticationSuccessHandler {
Log logger = LogFactory.getLog(CustomLoginSuccessHandler.class);
@Value("/toIndex.do")
private String defaultTargetUrl;
@Autowired
private SysUsersDao sysUsersDao;
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
this.saveLoginInfo(request, authentication);
logger.info("登录成功,即将forward:" + this.defaultTargetUrl);
// 登录成功之后将SECURITY放入上下文中
request.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());
request.getRequestDispatcher(this.defaultTargetUrl).forward(request, response);
}
private void saveLoginInfo(HttpServletRequest request, Authentication authentication) {
SysUsers user = (SysUsers) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String ip = HTTPUtils.getIpAddress(request);
user.setLastLogin(new Date());
user.setLoginIp(ip);
logger.info("登录用户:" + user);
this.sysUsersDao.saveOrUpdateSysUser(user);
}
}这个handler 以记录用户登录信息为例,实现了onAuthenticationSuccess方法
实际上这里可以做任何应该与用户一同初始化的工作
相关文章推荐
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Asp.Net Forms验证(自定义、角色提供程序、单点登录)
- phpcms v9默认后台登录地址修改方法
- 在16aspx.com上下了一个.net程序,怎么修改它的默认登录名和密码?
- Spring Security 自定义登录验证与自定义回调地址
- Asp.Net Forms验证(自定义、角色提供程序、单点登录)
- 杀毒绝招:用“记事本” 处理顽固程序(命令行修改默认打开方式)
- 修改wordpress默认作者专栏链接以及登录后转跳地址
- Yii 2.0 修改默认登录页面地址
- spring集成shiro实现登录认证自定义验证功能(认证采用国密SM4算法)
- 修改cas-server(三),自定义登录验证方式。
- SpringCloud系列三:SpringSecurity 安全访问(配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类)
- Asp.Net Forms验证(自定义、角色提供程序、单点登录)
- Asp.Net Forms验证(自定义、角色提供程序、单点登录)
- ASP.NET 应用程序级 验证用户是否登录 一般处理程序
- Asp.Net Forms验证(自定义、角色提供程序、单点登录)
- PHPCMS v9修改默认后台登录地址