搭建目的
Grails5使用新手,尝试记录一次使用Grails5结合Rest搭建一个前后端分离cms新闻发布项目,顺便了解一下grails都具有哪些可用的插件
使用框架版本
Grails版本:Grails5.0.1
Java:1.8
Rest:3.0.1
Spring-core:4.0.3
Grails5.0.1官方文档
一、官网下载Grails5.0.1版本
下载地址:Download | Grails® Framework
二、idea新建Grails工程
1.新建工程
idea新建工程,这边Java版本用的是1.8,Grails使用的是5.0.1
创建后工程目录默认是这样子的
2.在build.gradle文件引入配置
maven { url "https://repo.grails.org/artifactory/plugins-releases-local" }
classpath "org.grails.plugins:views-gradle:2.1.0"
apply plugin: "org.grails.plugins.views-json"
apply plugin: "org.grails.grails-gsp"
apply plugin: "com.bertramlabs.asset-pipeline"
implementation 'org.grails.plugins:spring-security-core:4.0.3'
implementation 'org.grails.plugins:spring-security-ui:4.0.0.M1'
implementation "org.grails.plugins:spring-security-rest:3.0.1"
implementation "org.grails.plugins:views-json:2.1.0"
这是我整个配置文件,根据上边引入配置可以参考一下配置的引用位置
buildscript {
repositories {
maven { url "https://repo.grails.org/grails/core" }
maven { url "https://repo.grails.org/artifactory/plugins-releases-local" }
}
dependencies {
classpath "org.grails:grails-gradle-plugin:$grailsGradlePluginVersion"
classpath "org.grails.plugins:hibernate5:7.1.0"
classpath "gradle.plugin.com.github.erdi.webdriver-binaries:webdriver-binaries-gradle-plugin:2.6"
classpath "com.bertramlabs.plugins:asset-pipeline-gradle:3.3.4"
classpath "org.grails.plugins:views-gradle:2.1.0"
}
}
version "0.1"
group "cmsRestRequestMap"
apply plugin: "eclipse"
apply plugin: "idea"
apply plugin: "war"
apply plugin: "org.grails.grails-web"
apply plugin: "com.github.erdi.webdriver-binaries"
apply plugin: "org.grails.plugins.views-json"
apply plugin: "org.grails.grails-gsp"
apply plugin: "com.bertramlabs.asset-pipeline"
repositories {
maven { url "https://repo.grails.org/grails/core" }
}
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
dependencies {
implementation 'org.grails.plugins:spring-security-core:4.0.3'
implementation 'org.grails.plugins:spring-security-ui:4.0.0.M1'
implementation "org.grails.plugins:spring-security-rest:3.0.1"
implementation "org.grails.plugins:views-json:2.1.0"
developmentOnly("org.springframework.boot:spring-boot-devtools")
compileOnly "io.micronaut:micronaut-inject-groovy"
console "org.grails:grails-console"
implementation "org.springframework.boot:spring-boot-starter-logging"
implementation "org.springframework.boot:spring-boot-starter-validation"
implementation "org.springframework.boot:spring-boot-autoconfigure"
implementation "org.grails:grails-core"
implementation "org.springframework.boot:spring-boot-starter-actuator"
implementation "org.springframework.boot:spring-boot-starter-tomcat"
implementation "org.grails:grails-web-boot"
implementation "org.grails:grails-logging"
implementation "org.grails:grails-plugin-rest"
implementation "org.grails:grails-plugin-databinding"
implementation "org.grails:grails-plugin-i18n"
implementation "org.grails:grails-plugin-services"
implementation "org.grails:grails-plugin-url-mappings"
implementation "org.grails:grails-plugin-interceptors"
implementation "org.grails.plugins:cache"
implementation "org.grails.plugins:async"
implementation "org.grails.plugins:scaffolding"
implementation "org.grails.plugins:hibernate5"
implementation "org.hibernate:hibernate-core:5.5.7.Final"
implementation "org.grails.plugins:events"
implementation "org.grails.plugins:gsp"
profile "org.grails.profiles:web"
runtimeOnly "org.glassfish.web:el-impl:2.2.1-b05"
runtimeOnly "com.h2database:h2"
runtimeOnly "org.apache.tomcat:tomcat-jdbc"
runtimeOnly "javax.xml.bind:jaxb-api:2.3.1"
runtimeOnly "com.bertramlabs.plugins:asset-pipeline-grails:3.3.4"
testImplementation "io.micronaut:micronaut-inject-groovy"
testImplementation "org.grails:grails-gorm-testing-support"
testImplementation "org.mockito:mockito-core"
testImplementation "org.grails:grails-web-testing-support"
testImplementation "org.grails.plugins:geb"
testImplementation "org.seleniumhq.selenium:selenium-remote-driver:3.141.59"
testImplementation "org.seleniumhq.selenium:selenium-api:3.141.59"
testImplementation "org.seleniumhq.selenium:selenium-support:3.141.59"
testRuntimeOnly "org.seleniumhq.selenium:selenium-chrome-driver:3.141.59"
testRuntimeOnly "org.seleniumhq.selenium:selenium-firefox-driver:3.141.59"
}
bootRun {
ignoreExitValue true
jvmArgs(
'-Dspring.output.ansi.enabled=always',
'-noverify',
'-XX:TieredStopAtLevel=1',
'-Xmx1024m')
sourceResources sourceSets.main
String springProfilesActive = 'spring.profiles.active'
systemProperty springProfilesActive, System.getProperty(springProfilesActive)
}
tasks.withType(GroovyCompile) {
configure(groovyOptions) {
forkOptions.jvmArgs = ['-Xmx1024m']
}
}
tasks.withType(Test) {
useJUnitPlatform()
}
webdriverBinaries {
chromedriver '2.45.0'
geckodriver '0.24.0'
}
tasks.withType(Test) {
systemProperty "geb.env", System.getProperty('geb.env')
systemProperty "geb.build.reportsDir", reporting.file("geb/integrationTest")
systemProperty "webdriver.chrome.driver", System.getProperty('webdriver.chrome.driver')
systemProperty "webdriver.gecko.driver", System.getProperty('webdriver.gecko.driver')
}
assets {
minifyJs = true
minifyCss = true
}
3.通过命令自动创建spring用户角色权限控制
s2-quickstart com.rxht.core BaseUser BaseRole
自动创建成功后会出现用户表、角色表、用户角色权限表,可以根据自身需求新增自己需要的BaseUser用户信息
4.配置rest相关文件
grails.plugin.springsecurity.password.hash.iterations = 1
grails.plugin.springsecurity.logout.postOnly = false
// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.rxht.core.BaseUser'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.rxht.core.BaseUserBaseRole'
grails.plugin.springsecurity.authority.className = 'com.rxht.core.BaseRole'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
[pattern: '/', access: ['permitAll']],
[pattern: '/error', access: ['permitAll']],
[pattern: '/index', access: ['permitAll']],
[pattern: '/index.gsp', access: ['permitAll']],
[pattern: '/shutdown', access: ['permitAll']],
[pattern: '/assets/**', access: ['permitAll']],
[pattern: '/**/js/**', access: ['permitAll']],
[pattern: '/**/css/**', access: ['permitAll']],
[pattern: '/**/images/**', access: ['permitAll']],
[pattern: '/**/favicon.ico', access: ['permitAll']],
[pattern: '/api/login/**', access: ['permitAll']],
[pattern: '/api/logout', access: ['isFullyAuthenticated()']],
[pattern: '/**', access: ['isFullyAuthenticated()']]
]
grails.plugin.springsecurity.filterChain.chainMap = [
[pattern: '/assets/**', filters: 'none'],
[pattern: '/**/js/**', filters: 'none'],
[pattern: '/**/css/**', filters: 'none'],
[pattern: '/**/images/**', filters: 'none'],
[pattern: '/**/favicon.ico', filters: 'none'],
[pattern: '/**', filters: 'JOINED_FILTERS']
]
grails.plugin.springsecurity.filterChain.chainMap = [
[pattern: '/api/**', filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter'],
[pattern: '/**', filters: 'JOINED_FILTERS']
]
grails.plugin.springsecurity.rest.token.storage.jwt.secret = 'pleaseChangeThisSecretForANewOne'
grails.plugin.springsecurity.rest.logout.endpointUrl = '/api/logout'
grails.plugin.springsecurity.rest.token.validation.useBearerToken = false
grails.plugin.springsecurity.rest.token.validation.headerName = 'X-Api-Token'
//令牌过期时间,秒
grails.plugin.springsecurity.rest.token.storage.jwt.expiration = 6000
grails.plugin.springsecurity.rest.login.failureStatusCode = 401
5.配置url访问UrlMappings
package cmsweb
class UrlMappings {
static mappings = {
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
"/"(view:"/index")
"500"(view:'/error')
"404"(view:'/notFound')
//允许匿名访问的路径
group "/v1", {
"/all/$action?/$id?(.$format)?" {
controller = "anonymity"
}
format = 'json'
}
//需要认证身份访问的路径
group "/api", {
"/$controller/$action?/$id?(.$format)?" {
}
format = 'json'
}
}
}
6.启动做一个初始化数据
package cmsweb
import com.rxht.core.BaseRole
import com.rxht.core.BaseUser
import com.rxht.core.BaseUserBaseRole
class BootStrap {
def init = { servletContext ->
addTestUsers();
}
def addTestUsers() {
BaseRole.withNewTransaction {
def role1 = new BaseRole(authority: "ROLE_USER").save()
def user1 = new BaseUser(username: "user1", password: "pwd1").save()
def userRole = new BaseUserBaseRole(baseUser: user1, baseRole: role1).save()
}
}
def destroy = {
}
}
尝试启动工程是否有效
启动成功,默认访问当前页面
7.我这边使用的Apifox测试访问rest登录地址,输入正确用户名密码后即可返回所需token