grails - 如何在grails中自定义spring security插件登录页面

标签 grails spring-security

我尝试在 spring security core 3.1.1 中自定义登录页面,但没有成功。 我在 views 目录中创建了一个登录目录,在登录目录中创建了一个 auth.gsp,并将我的自定义表单放在那里。 这是代码:

<g:form name="form-login" method="POST" action="${resource('file': 'j_spring_security_check')}">
     <label for="j_username">Username:</label>
      <g:textField name="j_username"/>
                <label for="j_password">Password:</label>
                <g:passwordField name="j_password"/>
            <g:submitButton name="login" value="Log in" />
    </g:form>

它接受了用户名和密码,但点击登录按钮后,它仍然显示表单。任何解决方案。

最佳答案

这是一个使用旧的 action 地址(导致重定向的核心问题)和用户名/密码的旧名称的旧表单(潜伏的问题本来会更令人沮丧,因为它总是会失败具有正确的值,因为如果为错误的参数名称设置它们将无法使用)。

在 3.x 中覆盖插件文件并不像在 2.x 中那么简单。在 2.x 中,插件是在项目根目录的 target 目录中解压的 zip 文件,您可以使用插件源做一些有效和/或疯狂的事情。在 3.x 中,插件是编译好的 jar,所以希望我们减少了疯狂的总量,但我们也让像这样有效的事情变得更难了。

但这是开源软件,确切的 .gsp 文件或足够接近的文件很容易在源代码库中找到,即 here .

auth.gsp 很少更改,因此可以获取 latest file from the master branch ,或者您可以查看历史记录(最近的构建是并且 future 的构建将继续被标记)因此很容易获得旧版本,例如from version 3.0.4 .

但这不一定是最终答案,因为该插件是非常可配置的,并且您可以在配置中覆盖 GSP 中使用的几个变量,因此您应该将查找值的代码替换为仅查找值的代码,因为您的应用不太可能从这种灵 active 中受益。配置设置的默认值位于 DefaultSecurityConfig.groovy 中,但我将此 GSP 留在查找代码中,因此您只需删除它并保留值即可。

这是内部 form 元素(您需要整个文件,但我没有显示不需要更改的部分):

<form action="${postUrl ?: '/login/authenticate'}" method="POST" id="loginForm" class="cssform" autocomplete="off">
    <p>
        <label for="username"><g:message code='springSecurity.login.username.label'/>:</label>
        <input type="text" class="text_" name="${usernameParameter ?: 'username'}" id="username"/>
    </p>

    <p>
        <label for="password"><g:message code='springSecurity.login.password.label'/>:</label>
        <input type="password" class="text_" name="${passwordParameter ?: 'password'}" id="password"/>
    </p>

    <p id="remember_me_holder">
        <input type="checkbox" class="chk" name="${rememberMeParameter ?: 'remember-me'}" id="remember_me" <g:if test='${hasCookie}'>checked="checked"</g:if>/>
        <label for="remember_me"><g:message code='springSecurity.login.remember.me.label'/></label>
    </p>

    <p>
        <input type="submit" id="submit" value="${message(code: 'springSecurity.login.button')}"/>
    </p>
</form>

对于初始传递,您可能希望将其更改为:

<form action="/login/authenticate' method="POST" id="loginForm" class="cssform" autocomplete="off">
    <p>
        <label for="username"><g:message code='springSecurity.login.username.label'/>:</label>
        <input type="text" class="text_" name="username" id="username"/>
    </p>

    <p>
        <label for="password"><g:message code='springSecurity.login.password.label'/>:</label>
        <input type="password" class="text_" name="password" id="password"/>
    </p>

    <p id="remember_me_holder">
        <input type="checkbox" class="chk" name="remember-me" id="remember_me"/>
        <label for="remember_me"><g:message code='springSecurity.login.remember.me.label'/></label>
    </p>

    <p>
        <input type="submit" id="submit" value="${message(code: 'springSecurity.login.button')}"/>
    </p>
</form>

您可以使用任何您想要的帖子 url 和用户名/密码参数名称,包括旧的,但您需要设置配置属性,以便处理登录的 Spring Security 过滤器正在查看正确的 uri 并期待参数名称你发送的。如果您接受默认设置,那么这将起作用,您当然可以根据需要进行任何常规 HTML 和 CSS/JS 更改。

关于grails - 如何在grails中自定义spring security插件登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38510921/

相关文章:

grails - Grails:用等效的HTML替换符号

javascript - 在单个下拉列表中填充来自两个不同列的值

java - Spring JWT - 添加自定义声明

grails - 即使用户已经登录,也可以通过spring acl插件重定向到登录页面?

grails - 使用@Secured闭包时如何获取 Controller 方法参数?

grails - 自定义g.select taglib,默认设置为grails

eclipse - 如何在Eclipse中指定Grails环境

ssl - 使用 j_username 和 j_password 作为输入字段名称是否存在安全风险

java - Spring Security,方法安全注释(@Secured)不起作用(java config)

Grails 中的 Spring Oauth2 提供程序 - 依赖项