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">&nbsp;</td>
        </tr>
        <tr>
            <td colspan='2'><input name="submit" type="submit">&nbsp;<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

Grails 使用 spring-security-core-3.0.6+ 重定向注销后

Grails 1.3.5 和 Spring Security Core