如何在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 代码