0

我目前正在尝试为我的 Spring Web 应用程序实现登录机制,我对 Spring 中使用的安全概念有点困惑。

如果我访问需要登录的页面,它会正确重定向到登录页面。登录后,实际页面可见(到目前为止很好)。

为此的代码

    <security:http use-expressions="true" auto-config="true">
    <security:intercept-url pattern="/login" access="permitAll" />
    <security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <security:form-login login-page="/login" default-target-url="/welcome"
            authentication-failure-url="/loginfailed" />
        <security:logout logout-success-url="/logout" />
        <security:remember-me/>
     </security:http>

但是,如果我再次访问同一页面,我需要再次登录。所以我需要某种安全会话。我已经尝试并阅读了很多关于记住我和会话管理的内容,但不知道如何去做。

有人可以给我一些指示,春季文档中的相应章节或关键字吗?

登录表单

<form name='f' action="<c:url value='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>

登录控制器.java

@RequestMapping(value="/login", method = RequestMethod.GET)
    public String login(ModelMap model) {

        return "login";

    }

    @RequestMapping(value="/loginfailed", method = RequestMethod.GET)
    public String loginerror(ModelMap model) {

        model.addAttribute("error", "true");
        return "login";

    }

    @RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logout(ModelMap model) {

        return "login";

    }
4

2 回答 2

1

为什么登录后的第二个请求没有维护安全会话,这很神秘,因为您的配置看起来不错。一些日志将有助于解决此问题。org.springframework.security在重现问题后启用跟踪级别日志记录并共享日志。

到目前为止,评论就足以说明这一点,但我还想澄清一下记住我功能的配置和使用,因为你在那里也遇到了一些问题。

记住我的服务应该与您在原始问题中的简单配置一起使用。由于您没有指定data-source-refon <remember-me>,因此将应用一个更简单且安全性较低的实现,它不会保留颁发给客户端的令牌。

这不是强制性的,但通过配置,data-source-ref您可以获得一些额外的安全性:如果他的记住我令牌(cookie)被盗并被攻击者用来以用户身份登录您的站点,您将能够警告用户. 这值得考虑投入额外的努力。

现在重要的是:remember-me 服务的一个文档不足的特性是客户端必须通过发送一个带有 name 的请求参数来明确要求服务器记住他的登录_spring_security_remember_me。因此,您必须在登录表单中插入类似以下代码段的内容。

<p>
    <label for="_spring_security_remember_me">Remember-me</label>
    <input id="_spring_security_remember_me" 
           name="_spring_security_remember_me" type="checkbox"/>
</p>

没有这个,remember-me 服务将无能为力。(为了完整起见:有一个替代选项可以alwaysRemember在 remember-me 服务上设置标志,但这有点不方便,因为这个配置点没有被安全命名空间公开)

于 2013-04-13T21:02:41.347 回答
1

您需要对 conf 文件中的安全定义进行此操作:

<security:remember-me services-alias="rememberMeService" data-source-ref="dataSource" user-service-ref="userService"/>
</security:http>

并创建一个持久网登录表

create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)

但我现在重复官方文档

于 2013-04-13T14:58:07.247 回答