Grails实战经验

Grails Spring security rest 实践与困

2020-02-13  本文已影响0人  杯子里希望的石头

       Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。

现在尝试用它来写一个服务端的程序。

创建基本程序的步骤,网上到处都有,这里就省略了。

为了实现用户验证需要以下几个步骤:

1.安装插件,2.执行插件附带的脚本文件,生成关键域类。3.手动修改一些配置参数。4.设置演示用的数据,然后测试。

1.安装插件

插件安装需要编辑build.gradle文件。本例采用最简单的方式,只需要安装核心以及rest插件。

compile'org.grails.plugins:spring-security-core:3.2.0'

compile'org.grails.plugins:spring-security-rest:2.0.0.M2'

插件的版本是有关系的,不同的版本可能导致所需配置的参数不同,甚至是无法启动。

2.执行脚本

按ctrl+alt+g,打开脚本执行窗口。

执行s2-quickstart cn.edu.cup.system User Role

第一个参数是包名,第二个是用户,第三是权限。

脚本执行后,会生成User, Role, UserRole三个域类。另外,还会增加一个监听器userPasswordEncoderListener在resources.groovy中。

第三,会生成application.groovy文件在conf目录下。一般情况下(本例),这个文件不需要编辑。

3. 手动修改一些配置参数

参考网上的例子(http://learnwebtechs.com/2017/02/14/grails-3-with-mongodb-and-spring-security-core-step-by-step)

需要编辑application.yml, 增加以下内容:

图中所选择的部分(尝试贴源代码失败,所以先贴个图)。

<code>

# 20200213

plugin:

springsecurity:

controllerAnnotations:

chainMap:

'/api/**':'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter'

                '/**':'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'

        rest:

logout:

endpointUrl:'/api/logout'

            token:

validation:

useBearerToken: false

headerName:'X-Auth-Token'

</code>

4.最后设置演示数据

演示数据包括一个测试域类cn.edu.cup.demo.TestA

<code>

@GrailsCompileStatic

@EqualsAndHashCode(includes='name')

@ToString(includes='name', includeNames=true, includePackage=false)

class TestA {

Stringname

    static constraints ={

}

}

</code>

这个域类的控制器上增加注释:@Secured('ROLE_ADMIN')

用户以及权限的生成代码如下:

首先是创建一个服务,用于生成数据。然后在BootStrap中调用。

<code>

def setupSampleData() {

        createSampleDemoData()

        createDefaultRoles()

        createDefaultUsers()

    }

private void createSampleDemoData() {

for (int i =0; i <20; i++) {

def t =new TestA(name:"张${i}李${i +1}")

t.save()

}

}

private void createDefaultRoles() {

if (!Role.findByAuthority('ROLE_ADMIN')) {

new Role(authority:'ROLE_ADMIN').save(flush:true)

}

}

private void createDefaultUsers() {

if (!User.findByUsername('admin')) {

def admin =new User(username:'admin',password:'123456')

admin.save(flush:true)

UserRole.create(admin, Role.findByAuthority('ROLE_ADMIN'),true);

}

}

</code>

5.测试

程序后的界面如下:

点击测试链接,就会弹出登录对话框:

登陆后,会返回测试数据:

另外,还采用VUE写了一个客户端:

以上是客户端的界面,右侧打开的是调试内容。点击登录:

登陆后,能够生成相应的令牌。参见截图:

点击测试,也能返回演示数据。

6.遇到的见鬼的问题

这个服务器看似没有问题,但是,运行时间长了,就不对了。——————

无论是web界面,还是客户端,登陆的时候都会:报告这个错误:No operations allowed after connection closed.

按错误判断,应该是数据库连接丢失。但是,一直不知道该如何排查这个错误!

希望网上的大侠指点一二!

上一篇 下一篇

猜你喜欢

热点阅读