Spring Security 使用非spring默认的登陆页面,是如何跳转到登陆成功页面的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security 使用非spring默认的登陆页面,是如何跳转到登陆成功页面的?相关的知识,希望对你有一定的参考价值。
Spring Security 使用非spring默认的登陆页面,是如何跳转到登陆成功页面的?
表单如下<form action="j_spring_security_check" method="post">
Spring Security 默认action="j_spring_security_check",让很多人不理解这个请求之后会跳转到哪里去,
这里我们就看
配置文件里这个<http></http>标签,这个标签里面最基本的是intercept-url,用来设置访问权限的。
<http></http>标签里面有个form-login 标签,这个标签有很多属性,大概情况如下:
form-login属性详解
1. login-page 自定义登录页url,默认为/login
2. login-processing-url 登录请求拦截的url,也就是form表单提交时指定的action
3. default-target-url 默认登录成功后跳转的url
4. always-use-default-target 是否总是使用默认的登录成功后跳转url
5. authentication-failure-url 登录失败后跳转的url
6. username-parameter 用户名的请求字段 默认为userName
7. password-parameter 密码的请求字段 默认为password
8. authentication-success-handler-ref 指向一个AuthenticationSuccessHandler用于处理认证成功的请求,不能和default-target-url还有always-use-default-target同时使用
9. authentication-success-forward-url 用于authentication-failure-handler-ref
10. authentication-failure-handler-ref 指向一个AuthenticationFailureHandler用于处理失败的认证请求
11. authentication-failure-forward-url 用于authentication-failure-handler-ref
12. authentication-details-source-ref 指向一个AuthenticationDetailsSource,在认证过滤器中使用
看到第三条属性没?default-target-url这个属性。
在这里我们假设 你登录成功需要调用一个名字叫toMain.do的action处理一些登录后的逻辑,比如SpringMVC或者Struts2,那么你就可以在http这个标签下配置
<http auto-config="true">
<form-login default-target-url="/toMain.do" />
</http>
这样我们就可以在登录成功后调用上面对应的action,关于action返回视图,SpringMVC和Struts2这里我就不多说了。 参考技术A 我来回答这个问题吧,很多人都是复制粘贴的,贼烦!!!
<form action="j_spring_security_check" method="post">首先这个表单是真正的向springsecurity提交登陆认证,把用户名和密码,传给springsecurity认证。
我们需要在spring security的配置文件里配置登陆成功的控制类,比如我这里配置的是
<s:form-login login-page="/system/login" authentication-success-handler-ref="loginLogHandler" />
loginLogHandler是类名LoginLogHandler首字母小写
登陆成功之后会跳转到LoginLogHandler,具体看下面这个类的逻辑处理:在这里用 response.sendRedirect(url)跳转到哪个页面。
@Component
public class LoginLogHandler implements AuthenticationSuccessHandler
@Autowired
private SystemSetService systemSetService;
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException
request.getSession().removeAttribute("SPRING_SECURITY_LAST_EXCEPTION");
//保存登陆成功之后的session
OperatorDetails user = (OperatorDetails) SpringSecurityUtils.getCurrentUser();
String userName = user.getUsername();
String password = user.getPassword();
Map<String, String> conditions = new HashMap();
conditions.put("password", password);
conditions.put("username", userName);
UserInfo userInfo = systemSetService.isValidUser(conditions);
request.getSession().setAttribute("user", userInfo);
//实现页面跳转
String interfaceUrl = request.getParameter("spring-security-redirect");
String redirectUrl = "";
if (StringUtils.isNotBlank(interfaceUrl))
redirectUrl = request.getContextPath() + interfaceUrl;
response.sendRedirect(redirectUrl);
else
String defaultUrl = "/main";
redirectUrl = request.getContextPath()+defaultUrl;
response.sendRedirect(redirectUrl);
参考技术B
这个其实很简单的,不需要做什么复杂的操作:
我写的是lambda,实现的是AuthenticationEntryPoint接口,你只要写一个该接口的实现类,直接写response.sendRedirect("/login"),这个就是跳到login页的接口url,还可以直接使用另一个方法,直接写登录页地址
我无法使用 Spring Security 登录
【中文标题】我无法使用 Spring Security 登录【英文标题】:I cannot login using Spring Security 【发布时间】:2019-01-12 16:34:42 【问题描述】:我在尝试使用 Spring Security 登录我的应用程序时遇到问题,无论我做什么,它总是将我重定向到我用于非授权访问的 JSP。
security-config.xml
的配置我试过hasRole('ROLE_USER')
和permitAll
都没有工作。
security-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<http>
<intercept-url pattern="/user/**" access="hasAnyRole('ROLE_USER') />
<form-login login-page="/customLogin.jsp"
login-processing-url="/appLogin"
username-parameter="app_username"
password-parameter="app_password"
default-target-url="/user/home" />
<logout
logout-url="/appLogout"
logout-success-url="/customLogin.jsp" />
<access-denied-handler error-page="/user/error" />
</http>
<beans:bean name="bcryptEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
<beans:bean name="myAppUserDetailsService"
class="com.prh.tracking.services.impl.UserDetailsServiceImpl" />
<beans:bean name="userService"
class="com.prh.tracking.services.impl.UserServiceImpl" />
<authentication-manager>
<authentication-provider
user-service-ref="myAppUserDetailsService">
<password-encoder ref="bcryptEncoder" />
</authentication-provider>
</authentication-manager>
<global-method-security
secured-annotations="enabled" />
</beans:beans>
UserController.java
@Controller
@RequestMapping("/user")
public class UserController
@Autowired
private UserService userService;
@RequestMapping(value="/home")
public String home(ModelMap model, Authentication authentication)
authentication.getPrincipal();
model.addAttribute("user", userService.getUser(authentication.getName()));
return "user-info";
@RequestMapping(value="/error")
public String error()
return "access-denied";
UserDetailsServiceImpl.java
@Service
public class UserDetailsServiceImpl implements UserDetailsService
@Autowired
private UserDAO userDAO;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
UserEntity user = userDAO.getUser(username);
GrantedAuthority authority = new SimpleGrantedAuthority(user.getRole());
UserDetails userDetails = (UserDetails)new User(user.getName(), user.getPassword(), Arrays.asList(authority));
return userDetails;
这是我的数据库中的内容:
【问题讨论】:
@GauravSrivastav 好吧,我找到了一个关于这个的教程,然后我就开始学习 Spring Security。 执行,祝你好运。 @GauravSrivastav 我希望在进行更多更改之前解决此问题,或者 Spring Security 仅适用于 Spring Boot? 如何查看密码? @sajib 就像我说的我遵循了一个教程并且仍然试图了解一切是如何工作的,我认为它是通过UserDetailsServiceImp
完成的,因为如果我尝试使用错误的密码访问,我会收到一条消息说凭据不正确。
【参考方案1】:
当您设置对permitAll
的访问权限时,您甚至不应该被要求提供凭据,并且根本不会咨询 UserDetailsServiceImpl。
您可能需要启用这样的网络安全表达式:
<http use-expressions="true">
看 https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html#el-access-web
【讨论】:
以上是关于Spring Security 使用非spring默认的登陆页面,是如何跳转到登陆成功页面的?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Security 为非授权用户隐藏数据表中的按钮
Spring Security OAuth 2 与传统 Spring MVC
前后端分离的Web应用程序中使用Spring Security+Mybatis+JWT非对称加密+动态权限管理:身份验证过滤器