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

Posted

技术标签:

【中文标题】如何在grails中自定义spring security插件登录页面【英文标题】:How to customize spring security plugin Login page in grails 【发布时间】:2016-11-25 10:35:05 【问题描述】:

我尝试在spring security core 3.1.1中自定义登录页面,但没有成功。 我在视图目录中创建了一个登录目录,并在登录目录中创建了一个 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>

它可以输入用户名和密码,但是在单击登录按钮时,它仍然显示表单。任何解决方案。

【问题讨论】:

【参考方案1】:

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

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

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

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

这不一定是最终答案,因为插件非常可配置,并且您可以在配置中覆盖 GSP 中使用的几个变量,因此您应该将查找值的代码替换为仅值,因为您的应用不太可能受益于这种灵活性。配置设置的默认值在 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中自定义spring security插件登录页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Security Grails 上自定义 /login/authenticate?

如何自定义 Grails Spring Security REST 登录响应 HTTP 代码

Grails spring security如何在自定义身份验证中记住我?

如何在 Spring Security 中自定义权限表达式

如何在 Spring Security 中自定义权限表达式

如何在 Spring Security 中自定义权限表达式