Grails 3 Spring Security 覆盖登录表单
Posted
技术标签:
【中文标题】Grails 3 Spring Security 覆盖登录表单【英文标题】:Grails 3 Spring Security override login form 【发布时间】:2016-05-16 03:43:00 【问题描述】:我从 spring 文档中发现了一些可以覆盖登录控制器和表单的内容。我只想在保留默认控制器的同时覆盖登录表单本身。我发现了这个:
在 grails 安全插件中,登录 gsp 页面位于 grails-app/views/login/auth.gsp 和控制器位于 grails-app/controllers/grails/plugin/springsecurity/LoginController.groovy。我不认为可以通过简单地创建自己的实现来覆盖控制器,但是您应该能够通过将自己的 auth.gsp 放在上面显示的相同路径中,在您的应用程序中覆盖 gsp 页面。
https://plus.google.com/117486613280979732172/posts/cvqcfAQVWE6
但是,这只是无法覆盖页面并且默认页面不断出现。有没有人用 Grails 3 和 spring 安全库做到这一点?
编辑: 我通过使用这些库并设置我自己的 bean 来使用 OAuth2。我认为另一种方法可能是使用 grails 插件来实现 spring 安全性。有没有办法使用这些库覆盖登录页面?
compile "org.springframework.boot:spring-boot-starter-security"
compile "org.springframework.security.oauth:spring-security-oauth2:2.0.8.RELEASE"
【问题讨论】:
在 github.com/vahidhedayati/grails-wschat-plugin/tree/master/… 插件中为我工作。尝试启用 Spring Security 调试以查看本地页面是否有任何问题。 它对我们有用。只需在项目中以正确的路径定义新的auth.gsp
文件 - grails-app/views/login/auth.gsp
就可以了。如果您的 auth.gsp
在您的自定义插件中,然后由应用程序使用,我已经看到了一些问题,但如果您在应用程序中有它,它应该可以工作
【参考方案1】:
好的,因为我没有使用 grails spring 安全插件,所以我需要用这里的指导替换登录页面: http://docs.spring.io/spring-security/site/docs/3.2.x/guides/form.html
基本上,我必须创建一个 LoginController
class LoginController
def auth()
def error()
然后,我将视图放置在各自的路径中:views/login/auth、views/login/error
这是一个示例 auth.gsp
<html>
<body>
<h1 id="banner">Login to Security Demo</h1>
<form name="f" action="/login/auth"
method="POST">
<table>
<tr>
<td>Username:</td>
<td><input type='text' name='username' /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='password'></td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td colspan='2'><input name="submit" type="submit"> <input name="reset" type="reset"></td>
</tr>
</table>
<input type="hidden"
name="$_csrf.parameterName"
value="$_csrf.token"/>
</form>
</body>
</html>
然后在HttpSecurity的配置中:
@Override
public void configure(HttpSecurity http)
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage('/login/auth')
.defaultSuccessUrl("/")
.failureUrl("/login/error")
.usernameParameter("username").passwordParameter("password")
.permitAll()
使用 grails 安全插件会很好,但我不知道如何使用 OAuth2。如果有人对此有指导,我会更改我接受的答案。
【讨论】:
【参考方案2】:对此有更简单和系统的方法。无需所有这些手动复制粘贴工作。
-
安装spring-security-core plugin后,在grails控制台使用
grails s2-quickstart
命令配置基本用户和角色域(其他方面可以通过s2-quickstart配置);
安装 spring-security-ui plugin 并使用 grails s2ui-override auth
命令覆盖 login/auth 表单(这将创建登录表单以便您覆盖它)
使用grails s2ui-override layout
覆盖表单的布局(这将创建 springSecurityUI.gsp 布局以便您覆盖它)
希望对你有帮助。
【讨论】:
以上是关于Grails 3 Spring Security 覆盖登录表单的主要内容,如果未能解决你的问题,请参考以下文章
Grails 3 Spring Security 覆盖登录表单
Grails 3 和 Spring Security:当用户未登录时返回 401
grails 3 spring security boot starter登录页面定制
Grails - 卸载 Spring Security Core