Grails5.0.1+rest3.0.1实现token登录

搭建目的

        Grails5使用新手,尝试记录一次使用Grails5结合Rest搭建一个前后端分离cms新闻发布项目,顺便了解一下grails都具有哪些可用的插件


使用框架版本

        Grails版本:Grails5.0.1

        Java:1.8

        Rest:3.0.1

        Spring-core:4.0.3

Grails5.0.1官方文档

        网址:The Grails Framework 5.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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值