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,还可以直接使用另一个方法,直接写登录页地址

参考技术C 好像没遇到过这 个问题。 Spring Security 好像又一个配置文件可配置。

我无法使用 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";
    

UserDetailsS​​erviceImpl.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 的访问权限时,您甚至不应该被要求提供凭据,并且根本不会咨询 UserDetailsS​​erviceImpl。

您可能需要启用这样的网络安全表达式: &lt;http use-expressions="true"&gt;

看 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 更新 acl

Spring Security,安全和非安全访问

我无法使用 Spring Security 登录

Spring Security OAuth 2 与传统 Spring MVC

前后端分离的Web应用程序中使用Spring Security+Mybatis+JWT非对称加密+动态权限管理:身份验证过滤器