【问题标题】:j_username cannot be accessed using spring_security_checkj_username 无法使用 spring_security_check 访问
【发布时间】:2012-06-19 05:52:52
【问题描述】:

我使用 spring_security_check 创建了一个登录页面。
这里:

<form name='f' action="/sec_test/j_spring_security_check" method='POST'>

    <table>
        <tr>
            <td>User:</td>
            <td><input type="text" name="j_username" value=''>
            </td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type="password" name="j_password" />
            </td>
        </tr>
        <tr>
            <td colspan='2'><input name="submit" type="submit"
                value="submit" />
            </td>
        </tr>
        <tr>
            <td colspan='2'><input name="reset" type="reset" />
            </td>
        </tr>
    </table>
</form>

但之后我无法访问 j_username

我试过了:

* request.getParameter("j_username")
* request.getAttribute("j_username")
* request.getAttribute("j_username")
* request.getUserPrincipal().getName()
* request.getRemoteUser()

从他们所有人那里,我得到的都是空的!

知道该怎么做吗?

【问题讨论】:

  • 我应该补充一点,我已经使用了 session.getAttribute("SPRING_SECURITY_LAST_USERNAME") 并且仍然是 null。

标签: spring spring-security j-security-check


【解决方案1】:

Spring 根据配置文件中配置的身份验证类型为您进行身份验证。一旦身份验证成功,它就会重定向到登录成功 url(比如 /login.htm)。因为它重定向到 /login.htm,所以除非在覆盖身份验证过滤器的请求中明确设置,否则您将不会获得任何请求参数(用户名/用户角色)。

认证成功后,spring 将认证信息存储在安全上下文中,包括用户角色。您可以从 SecurityContext 访问此信息。参考-link

【讨论】:

  • 非常感谢@sunil。我试过 ** Authentication auth = SecurityContextHolder.getContext().getAuthentication();字符串名称 = auth.getName(); ** 并且成功了。
【解决方案2】:

我很想看看你的 spring 配置文件。无论如何,当 Spring Security 实际为您执行此操作时,您似乎正在尝试验证用户的凭据。如果您不确定如何开始,请阅读 spring 的文档,包括您可以找到的任何在线教程。这是我的 Spring 安全配置的样子:

<security:http auto-config="true" use-expressions="true" access-denied-page="/login.html">
    <security:form-login
        login-page="/login.html"
        authentication-failure-url="/loginfail.html"
        default-target-url="/authenticate.html"/>

    <security:logout
        invalidate-session="true"
        logout-success-url="/login.html"
        logout-url="/logoff.html"/>
</security:http>

<bean id="securityDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/security_DS"/>
    <property name="resourceRef" value="true"/>
</bean>

<bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" />

<security:authentication-manager>
    <security:authentication-provider>
        <security:password-encoder ref="encoder" />
        <security:jdbc-user-service 
            data-source-ref="securityDataSource"
            authorities-by-username-query="SELECT l.user_name as username, r.role_name AS authority FROM login l join user_role ur on l.user_id = ur.user_id join role r on ur.role_id = r.role_id WHERE l.user_name = ?"
            users-by-username-query="SELECT user_name as username, password_value AS password, active_flg AS enabled FROM login WHERE user_name = ?"
        />        
    </security:authentication-provider>
</security:authentication-manager>

如果您想在 spring 验证用户凭据后访问用户名,请执行以下操作:

@RequestMapping(value = { "/authenticate.html" }, method = { RequestMethod.GET, RequestMethod.HEAD })
public ModelAndView authenticateUser(final HttpServletRequest httpServletRequest, HttpSession httpSession, Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    String userName = user.getUsername();
    ...

您可以看到请求将根据我在spring config中指定的default-target-url转发到/authenticate.html方法。

【讨论】:

  • 事实上,我对验证用户名/密码之类的事情不感兴趣,而 spring 已经这样做了。我想要的只是在登录页面之后的所有其他页面的顶部显示 j_username 。我仍然无法访问它。
  • j_username不是通过名字“j_username”访问的,所以也不是通过request.getParameter("j_username")访问的。相反,您可以通过我已经提到的 Authentication 对象访问它。见 (stackoverflow.com/questions/5042983/…)
  • 你能给我一个java版的答案吗?我之前按照那个答案,我什么也没得到。
  • 我发现这个答案很有趣也很有用... (stackoverflow.com/questions/8764545/…)
猜你喜欢
  • 2017-05-24
  • 2021-08-10
  • 2017-07-30
  • 2018-02-09
  • 2016-05-16
  • 2015-04-04
  • 2013-01-01
  • 2014-08-31
  • 2023-03-17
相关资源
最近更新 更多