显示导航

365bet地区带有365bet地区和Spring Security REST的Google OAuth

365bet地区了解如何将Google OAuth与365bet地区和Spring Security REST插件一起使用

本·莱茵

365bet地区版本 3.3.2

入门

在本指南中,我们将向您展示如何使用来将Google OAuth身份验证添加到您的应用春季安全休息插入

我们将使用春季安全休息插入

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails oauth谷歌初始

您可以直接前往如果你光盘进入grails指南grails oauth谷歌完整

365bet地区如果要从头开始,请使用创建新的365bet地区应用程序365bet地区365bet地区应用伪造.

伪造默认

OAuth验证

OAuth是许多财富公司用来保护网站和应用程序安全的行业标准身份验证协议。它的工作机制允许第三方授权服务器由帐户所有者批准访问权限的情况下发出访问令牌。在我们的案例中,我们将使用Google,一个非专业术语,即Google用户批准其帐户以将访问令牌发行回请求的应用程序

设置和配置Google OAuth

要在您的应用程序上启动并运行Google OAuth,需要在网站上进行一些工作和配置Google Developer Console.

谷歌开发者回家

继续并登录,然后滚动到页面底部以选择Google API控制台

apiConsoleSelect

选择建立专案

googleCreateProject

给您的Google项目起个名字在这种情况下,我们给它起个名字Oauth测试

项目名

等一下,Google创建您的新项目

waitWhileProjectIsCreated

选择启用API和服务

dashboardPostProjectCreate

在搜索屏幕上搜索Google

apiSearch

选择Google API

搜索GooglePlus

请点击启用等一下它打开

enableApi

现在回到仪表板上,单击创建凭证

dashboardPostApi

步骤确保Google API与选择网络服务器选项和用户数据然后单击我需要什么凭证

addCredentials

步骤输入您选择的名称或保留默认设置,设置您的前端URL和插件oauth回调Google网址,然后点击创建客户端ID

addCredentials

步骤选择您的gmail并给产品起一个名字,以便用户知道他们要认证的内容,然后点击继续

addCredentials

步骤下载您的凭据JSON,然后单击完成

addCredentials

这将带您返回凭证主页

credentialsHome

这是需要在Google即时中完成的所有设置。我们将着眼于设置我们的应用程序以及为连接我们的应用程序而下载的凭据

设置您的应用

有了我们所有的Google配置之后,就可以配置我们的应用以使用安全性,并通过Google使用基于REST的OAuth进行连接

下一个图表描述了我们将要实现的安全解决方案

图

添加安全依赖性

我们要做的第一件事是添加春季安全休息我们的插件建立gradle文件

建立gradle
编译'org grails插件春季安全核心'编译'org grails插件Spring Security Rest RC'

自定义令牌阅读器

我们重写默认的令牌读取器以从cookie中读取JWT令牌

实施令牌读取器

src main groovy演示JwtCookieTokenReader groovy
演示进口 grails插件springsecurity rest令牌AccessToken
进口 grails插件springsecurity rest令牌读取器TokenReader
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j

进口 javax servlet http Cookie
进口 javax servlet http HttpServletRequest

自我
静态编译
 JwtCookieTokenReader 实施令牌读取器最后 静态的 默认Cookie名称'智威汤逊'

    cookieName默认COOKIE名称覆写AccessToken findToken HttpServletRequest请求日志调试"在名为cookie的cookie中寻找jwt令牌"cookieNametokenValue空值Cookie cookie请求getCookies查找cookie cookie cookie名称等于equalsIgnoreCase cookieName如果cookie tokenValueValue cookie值日志调试"代币${tokenValue}"
        返回tokenValueAccessToken tokenValue空值

    }
}

注册在grails app conf春季资源groovytokenReader.

grails app conf春季资源groovy
进口 但是Jwt Kookie和Kenrea豆tokenReader JwtCookieTokenReader cookieName'wt'
    }
...
..
.
}

配置安全性

添加依赖项后,我们需要配置安全性

建立档案应用程序具有以下内容staticRules组态

grails应用配置会议应用程序
grails插件springsecurity controllerAnnotations staticRules图案: '/',               访问: ['allowAll']],
        [图案: '错误',          访问: ['allowAll']],
        [图案: '指数',          访问: ['allowAll']],
        [图案: '索引gsp',      访问: ['allowAll']],
        [图案: '关掉',       访问: ['allowAll']],
        [图案: '资产',      访问: ['allowAll']],
        [图案: 'js',       访问: ['allowAll']],
        [图案: '的CSS',      访问: ['allowAll']],
        [图案: '图片',   访问: ['allowAll']],
        [图案: '网站图标', 访问: ['allowAll']]
]

365bet地区添加下一个块以配置365bet地区 Spring Security Rest插件

grails应用配置会议应用程序
grails插件springsecurity rest令牌验证useBearerToken (1)enableAnonymousAccess真正 (2)存储jwt秘密'foob​​ar'*4 (3)oauth frontendCallbackUrltokenValue"http本地主机身份验证成功令牌${tokenValue}" } (4)google client org pac j oauth client Google Client(5)'谷歌密钥' (6)秘密'Google机密' (7)scope org pac j oauth client Google Client Google Scope电子邮件和个人资料(8)defaultRoles[] (9)providerNames'onymousAuthenticationProvider'] (10)
                }
        }
}
1 您必须禁用承载令牌支持才能注册自己的tokenReader实现
2 365bet地区启用对使用365bet地区 Spring Security Rest插件过滤器的URL的匿名访问
3 用于签署JWT令牌的必需机密
4 选择您的Google用户后的回调URL,这是将使用JWT令牌调用的回调URL,该令牌可验证用户身份
5 在我们的案例中要使用哪个pac j客户端,Google客户端
6 打开你的客户端ID json您在设置Google时下载的内容客户编号作为系统属性谷歌密钥当您启动应用程序时
7 打开你的客户端ID json您在设置Google时下载的内容客户机密作为系统属性谷歌密钥当您启动应用程序时
8 范围可以来自枚举org pac j oauth客户端Google客户端Google范围的任何值
9 允许Google身份验证访问的特定角色
10 我们将仅针对Google对用户进行身份验证,因此我们仅使用匿名身份验证提供程序。身份验证提供者Spring Security Core插件文档中的内容

要启动该应用程序,您需要提供客户编号客户机密作为系统属性

gradlew DGOOGLE KEY XXXXXX DGOOGLE SECRET XXXX bootRun

虽然范围可以来自枚举org pac j oauth客户端Google客户端Google范围的任何值,但如果您使用默认的OauthUserDetailsS​​ervice,则需要使用EMAIL AND PROFILE,这是因为默认实现使用配置文件ID作为用户名,并且仅如果使用EMAIL AND PROFILE范围,则由Google返回

我们希望我们的应用默认情况下是无状态的,并且某些端点允许匿名访问

grails应用配置会议应用程序
匿名过滤器'AnonymousAuthenticationFilter restTokenValidationFilter restExceptionTranslationFilter filterInvocationInterceptor' (1)grails插件springsecurity filterChain chainMap图案: 'dbconsole',      过滤器: '没有'],
                [图案: '资产',      过滤器: '没有'],
                [图案: 'js',       过滤器: '没有'],
                [图案: '的CSS',      过滤器: '没有'],
                [图案: '图片',   过滤器: '没有'],
                [图案: '网站图标', 过滤器: '没有'],
                [图案: '/', 过滤器匿名过滤器(1)
                [图案: '书展', 过滤器匿名过滤器(1)
                [图案: 'book最喜欢的索引', 过滤器匿名过滤器(1)
                [图案: '验证成功', 过滤器匿名过滤器(1)
                [图案: 'oauth对Google进行身份验证', 过滤器匿名过滤器(1)
                [图案: 'oauth回调Google', 过滤器匿名过滤器(1)
                [图案: '/**', 过滤器: 'JOINED FILTERS匿名身份验证过滤器异常翻译过滤器身份验证处理过滤器安全性上下文持久性过滤器记住我身份验证过滤器'],  (1)
]
1 无令牌时允许匿名访问的无状态链。但是,如果令牌在请求中,它将被验证
2 是一个不允许匿名访问的无状态链,因此将始终需要令牌,如果缺少令牌,则会将错误请求响应发送回客户端
我们没有将用户信息保留在数据库中您可能已经注意到我们没有用户, 角色, 用户角色项目中的域类我们都没有设置配置值,例如userLookUp userDomainClass等等

现在我们覆盖登录验证视图,以便我们不再在该页面中显示用户名密码表单

grails应用程序视图登录身份验证gsp


    "布局"内容"${gspLayout'主要'}"/>
    365bet地区跨度类关键字g跨度消息代码跨度类字符串跨度类分隔符跨度类内容springSecurity登录标题跨度类分隔符跨度跨度类regexp跨度类分隔符跨度类内容标题跨度跨度类错误跨度跨度类regexp跨度类分隔符跨度跨度类内容头跨度跨度类错误跨度主体div ID跨度类字符串跨度类定界符跨度类内容登录跨度跨类定界符跨度div跨度类类型跨度类字符串跨度分隔符跨度类跨度类内容内部居中跨度类分隔符span span span class class div span span class type class span span class string string span class delimiter span span class content fheader span span class delimiter span span span class class g span message cod e跨度类字符串跨度类分隔符跨度类内容springSecurity登录标头跨度类分隔符跨度跨度类regexp跨度类分隔器跨度类内容div跨度跨度类错误跨度类关键字g跨度类关键字如果跨度测试跨度类字符串跨度类分隔符,跨度类内容Flash消息跨度,类分隔符,跨度div跨度类类型,类跨度,类跨度,字符串跨度类,分隔符,跨度类内容,登录消息跨度,类分隔符,跨度,类跨度,错误跨度,Flash跨度,regreg跨度类分隔符span跨度class内容div span跨度class错误跨度class regexp regexp类class delimiter span跨度class content g如果span span跨度class error跨度class regexp span cl屁股分隔符跨度类别内容div跨度跨度类别误差跨度类别regexp跨度类别分隔符跨度类别内容div跨度跨度类别错误跨度类别regexp跨度分隔器跨度类别内容主体跨度跨度类别误差跨度类别regexp跨度类分隔符跨度类内容html跨度代码pre div div div类段落p我们在该页面中不包含用于Google登录的按钮,因为我们已将该按钮包括在根布局中,即主gsp em文件p div h id注销注销处理程序h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth google edit master src主要文档指南注销adoc i类fa fa铅笔平方oi改进此doc按钮div div div类段落p Spring Security允​​许注册自定义a href https grails插件github io grails spring安全核心x索引html logoutHandlers注销处理程序a注册新的注销处理程序以清除JWT cookie我们重用Spring Security附带的代码CookieClearingLogoutHandler代码p div div类段p修改grails应用程序conf春季资源groovy代码p div div类listblockdiv div类标题grails app conf春季资源groovy div div类内容pre class CodeRay高亮代码数据lang groovy span class关键字import span span class include org springframework security web authentication注销CookieClearingLogoutHandler跨度bean cookieClearingLogoutHandler CookieClearingLogoutHandler跨度类字符串span跨度类分隔符span跨度类内容jwt span跨度类分隔符span跨度代码pre div div div类段p添加Spring Security Core插件代码的自定义注销处理程序注销处理程序名称代码p div div类清单block div类标题grails应用程序conf应用程序groovy div div类内容pre class类别CodeRay高亮代码数据lang groovy grails插件springsecurity注销处理程序名称跨度类字符串跨度类分隔符跨度跨度类的内容RememberMeServices跨度类定界符跨度类跨度字符串字符串跨度类分隔符跨度类内容securityContextLogoutHandler跨度跨度类分隔符跨度跨度类字符串跨度类分隔符跨度跨度类内容cookieClearingLogoutHandler跨度跨度类分隔符跨度跨度代码pre div div h id authController JWT Cookie h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth google e dit master src主要文档指南authController adoc i类fa fa铅笔平方oi改进此doc按钮div div类段落p创建代码AuthController groovy代码当用户使用Google代码成功登录时,调用AuthController成功代码p div div类admonitionblock注释表tr td类图标i类fa图标注释标题说明i td td类内容代码AuthController成功代码的路径在代码应用程序groovy中的代码frontendCallbackUrl代码中使用代码td tr表div div类listlistblock div类标题grails应用程序控制器演示AuthController groovy div div类的内容课前类CodeRay高亮代码数据lang groovy span类关键字包span跨度demo span类关键字import span span类include grails配置config span span class关键字import span span class include grails核心支持Grail sConfigurationAware跨度类关键字导入跨度类包括grails插件springsecurity注释安全跨度类关键字import跨度类包含grails插件springsecurity rest令牌读取器TokenReader跨度类关键字导入跨度类include groovy util logging Slf j跨度类关键字import span span class include javax servlet http Cookie span span class注解Slf j span span class type类span span class类AuthController span span class指令实现span GrailsConfigurationAware TokenReader tokenReader spanReader span类类型int span jwtExpiration span class预定义类型String span grailsS​​erverUrl span class类指令static span allowMethods span类密钥成功span类类字符串span类类定界符span类类内容GET span类类定界符span span span class key log out span span class string string span class delimiter span span class content POST span span class delimiter span span span class注解安全的span span class string string span class delimiter span span class content允许所有span span class定界符span span span class class关键字def span跨度类函数成功度跨度类预定义类型字符串跨度令牌日志调试跨度类字符串跨度类定界符跨度类内容令牌值跨度类定界符跨度令牌跨度类关键字如果跨度令牌Cookie cookie jwtCookie令牌响应addCookie cookie i类conum数据值ibb跨度类关键字grailsS​​erverUrl跨度grailsS​​erverUrl跨度类指令受保护的跨度Cookie jwtCookie跨度类predefi ned类型字符串span spanTokenValue Cookie jwtCookie span class关键字new span cookie cookieNameName tokenValue jwtCookie maxAge jwtExpiration i类conum数据值ibb jwtCookie path span class字符串span class定界符span span class content content span span定界符span span jwtCookie setHttpOnly span class预定义常数true span i类conum数据值ibb span类关键字if span httpOnly jwtCookie setSecure span类预定义常量true span i类conum数据值ibb jwtCookie span类注解覆盖span类类型type void span setConfiguration config co jwtExpiration co getProperty span类类string span span class delimiter span span类内容grails插件springsecurity rest令牌存储memcached expira范围跨度类分隔符跨度类预定义类型整数跨度跨度类整数跨度i类消耗数据值跨度类指令受保护的跨度类类型布尔值跨度httpOnly grailsS​​erverUrl startsWith跨度类字符串跨度类定界符跨度类内容https跨度类定界符跨度跨度类指令受保护的跨度类预定义类型字符串跨度cookieName跨度类关键字如果跨度tokenReader跨度类关键字instanceof span JwtCookieTokenReader span类关键字return span JwtCookieTokenReader tokenReader cookieName i cl屁股conum数据值ibb span class关键字return span span class字符串span class定界符span span class content jwt span span class定界符span代码pre div div div class colist阿拉伯语表tr td i类conum数据值ibb td td响应Cookie将JWT令牌作为值td tr tr td i类消耗数据值ibb td td响应具有相同名称和代码的cookie,最大代码等于删除cookie,因此它将注销用户td tr tr td i类消耗数据值ibb td td防止在您的站点中执行任何Javascript,甚至阻止您自己的javascript编写代码文档cookie代码并访问cookie td tr tr td i类conum数据值ibb td td如果您使用http而不是https,则cookie不会离开您应该在生产中使用https td tr tr td我上课conum数据值ibb td td设置cookie过期以匹配JWT过期td tr tr td i类conum数据值ibb td td使用相同的cookie名称,我们之前定义的自定义代码tokenReader代码期望td tr表div div div类admonitionblock注释表tr td类图标i类fa图标注释标题注意i td td类内容由于此应用程序安全解决方案的无状态性质,要注销用户,需要删除包含其JWT令牌的cookie td tr表div div类段p GSP代码成功代码操作将执行简单的重定向到主页,我们在客户端进行重定向以确保正确设置了cookie p div div类listinglistdiv div类title grails应用程序视图auth成功gsp div div类内容pre class CodeRay高亮代码数据郎groovy html头meta http等值跨度类字符串跨度类分隔符跨度类内容刷新跨度跨度类分隔符跨度内容跨度内容跨度类字符串跨度类分隔符跨度类内容URL跨度类跨类内联跨度类内联分隔符跨度grailsS​​erverUrl跨度类字符串跨度类分隔符跨度类内容http本地主机span跨度类分隔符span跨度类inline分隔符span跨度class内容span跨度类delimiter跨度span跨度regexp span class分隔符span跨度内容head span跨度class错误跨度body跨度class key g span消息代码span跨度字符串跨度类分隔符span span class content redirecting span span class delimiter span span span class keyword default span span class字符串span class class delimiter span span class cont ent重定向span跨度类分隔符span跨度跨类regexp span class分隔符跨度类内容body span跨度类error span跨度类regexp span class分隔符span跨度类内容html span span code pre div div h id logging增强日志记录h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth google edit master src主要文档指南记录adoc i类fa fa铅笔平方oi改进此doc button div div类段落p如果您愿意启用增强的日志记录功能,以便您可以看到在调用Google的OAuth api时返回的内容。将以下内容添加到代码中。backgro groovy代码文件p div div class listingblock div class title grails app conf logback groovy div div div class content pre class CodeRay hi ghlight代码数据lang groovy记录器span class string span span class delimiter span span class content org springframework security span span class delimiter span span DEBUG span class string string span class delimiter span span class content STDOUT span span class delimiter span span span class预定义的常量false span记录器跨度类字符串跨度类定界符跨度类内容grails插件springsecurity跨度类定界符跨度DEBUG跨度类字符串跨度类定界符跨度类内容STDOUT跨度类定界符跨度跨度类预定义常数false跨度记录器跨度类字符串跨度定界符span span class content org pac j span span class delimiter span span DEBUG span class string string span class delimiter span span class content STDOUT span span class classlimiter span span span类预定义常数false跨度代码pre div div h id buildingTheApp构建应用程序h div类贡献btn按钮类型btn btn btn默认onclick窗口位置href https github com grails指南grails oauth google edit master src主要文档指南buildingTheApp adoc i类fa fa Pencil square oi改进此doc按钮div div类段落p我们将快速构建一个列出书并允许我们收藏它们的应用程序。仅当我们使用google p div h id域登录后,收藏按钮才可用域h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth google edit master src主要文档指南域adoc i类fa fa铅笔平方oi改进此doc按钮div div类段落p您的域,我们将需要域对象代码书代码和代码书收藏夹代码创建如下p div div类listingblock div类标题grails应用程序域演示书groovy div div类内容预课CodeRay高亮代码数据lang groovy span class关键字package span demo span class关键字import span span class include grails编译器GrailsCompileStatic span span class注解GrailsCompileStatic span span class type class span span class class书本span span class预定义类型String span image span class预定义类型String span span title span class预定义类型String span span author span class预定义类型字符串跨度关于跨度类预定义类型字符串跨度href跨度类指令静态跨度映射图像跨度类关键字可空跨度跨度类预定义常量假跨度标题跨度类y nullable span span类预定义常量false span作者span类关键字nullable span span类预定义常量false span关于span类关键字nullable span span类预定义常量false span href span类关键字nullable span span类预定义常量false span关于span类关键字类型跨度跨度类字符串跨度类分隔符跨度跨度类内容文本跨度跨度类分隔符跨度跨度代码pre div div div div class listingblock div class title grails app domain demo BookFavourite groovy div div div class content content pre class CodeRay Highlight code data lang groovy span class keyword package span演示span类类关键字import span类类include grails编译器GrailsCompileStatic span类类注解GrailsCompileStatic span类类类型span类类BookFavourite span span类预定义类型long span bookId span类预定义类型String span用户名span类指令静态span约束bookId span class键可为空span类class预定义常量false span用户名span类键nullable span类class预定义常量false span代码pre div div h id data您的数据h div类贡献btn按钮类型btn btn默认onclick窗口位置href https github com grails指南grails oauth google编辑主src主要文档指南数据adoc i类fa fa铅笔平方oi改进此doc按钮div div类p段此时,我们将创建图书数据,以便继续进行一些工作。继续,使您的代码BootStrap groovy代码与以下p div div类admonitionblock注释表tr td类相匹配。图标i类fa图标注释标题说明i td td类内容所需的图像资源已添加到您的初始项目中td tr表div div类列表listingblock div类标题grails应用程序初始化演示BootStrap groovy div div类内容课前CodeRay高亮代码数据lang groovy span class关键字package span demo span span class关键字import span span class include groovy transform CompileStatic span span class注解CompileStatic span span class type class span span class class BootStrap span span class指令public span span class指令final span span class指令静态跨度类预定义类型列表跨度类预定义类型地图跨度类预定义类型字符串跨度类预定义类型字符串跨度GRAILS BOOKS标题跨度类字符串跨度类de限流器跨度类内容Grails分步跨度跨度类分隔符跨度跨度类密钥作者跨度类字符串跨度类分隔符跨度跨度类内容Cristian Olaru跨度类定界符跨度跨度类关键符href跨度类字符串跨度类分隔符跨度跨度类内容https grailsthreebook com跨度类定界符跨度关于跨度类字符串跨度类定界符跨度类内容了解如何通过Grails使用配置文件和插件来快速有效地实现完整的未开发应用程序。将本书附带的示例应用程序用作一个示例span跨度类分隔符span跨度类关键字图像span跨度类string跨度类分隔符span跨度类内容grails逐步pn g span span class定界符span span标题span class string span class定界符span span class content实用Grails span span class定界符span span class键作者作者span class class string string span class定界符span span class content Eric Helgeson span span class定界符span span href跨度类字符串跨度类定界符跨度类内容https www grails book com跨度类定界器跨度关于跨度类字符串跨度类定界符跨度类内容了解有关构建Grails应用程序的基本概念的第一本书,专门针对Grails Real。提供了日期代码示例,因此您可以轻松地遵循span span class delimiter span span span class key image sp跨度类字符串跨度类分隔符跨度类内容实用grails书籍封面png跨度跨度类分隔符跨度标题跨度类字符串跨度类分隔符跨度类内容Falando de Grails跨度类别类分隔符跨度跨度类关键字作者跨度类字符串跨度类分隔符跨度类内容Henrique Lobo Weissmann跨度类分隔符跨度href跨度类字符串跨度类分隔符跨度类内容http www casadocodigo combr br产品livro grails跨度类分隔符跨度范围跨度类字符串跨度分隔符跨度跨度类内容这是Grails上最好的参考,用葡萄牙语编写。它是处理有关细节的框架的出色指南许多用户倾向于忽略span跨度类分隔符span跨度类关键字图像image span跨度类string跨度类分隔符span跨度类内容grails weissmann png跨度类分隔符span标题跨度类string跨度类分隔符span跨度类内容Grails Goodness Notebook span跨度类分隔符跨度间距类关键作者跨度类字符串跨度类分隔符跨度类内容Hubert A Klein Ikkink跨度类分隔符跨度href跨度类字符串跨度类定界符跨度类内容https leanpub com grails善良笔记本跨度类分隔符span span关于span类字符串span span class delimiter span span class content体验Grails框架通过代码段了解k通过代码示例和简短文章发现Grails的隐藏功能这些文章和代码将带您快速入门,并深入了解Grails span span class delimiter span span class key image span span class string span class delimiter span span class content Grailsgood png跨度类分隔符跨度标题跨度类字符串跨度类分隔符跨度类内容《 Grails权威指南》跨度类分隔符跨度类关键字作者跨度类字符串跨度类分隔符跨度类内容杰夫·斯科特·布朗和格雷姆Rocher跨度类分隔符跨度href跨度类字符串跨度类分隔符跨度类内容http www apress com跨度类分隔符span关于字符串类span span类分隔符span span class content类分隔符span span class content如标题所述,这是在Grails框架上的确定性参考,由开发团队的核心成员编写。span span类分隔符span span class class key image span span class string跨度类分隔符跨度类内容grocher jbrown Cover jpg跨度类分隔符跨度标题跨度类字符串跨度类分隔符跨度类内容Grails in Action跨度跨度类分隔符跨度跨度类关键作者跨度跨度类跨度分隔符跨度类内容Glen Smith和Peter Ledbrook跨度跨度类分隔符跨度href跨度字符串跨度类别分隔符跨度spa n类内容http www.manning com gsmith span跨度类定界符span跨度关于跨度类字符串span跨度类定界符span跨度类内容第二版Grails in Action是Grails的全面介绍,致力于帮助您成为高效的跨度跨度类分隔符跨度跨度类别关键图像跨度类别字符串跨度类别分隔符跨度类别内容gsmith cover jpg跨度类别分隔器跨度标题跨度类别字符串跨度类别分隔器跨度类别内容Grails快速入门指南跨度类别分隔符跨度类别主要作者span跨度类string跨度类定界符span跨度类内容Dave Klein和Ben Klein span跨度类定界符span span href跨度类字符串跨度类分隔符跨度类内容http://www.amazon.com gp产品标签misa跨度类分隔符跨度关于跨度类字符串跨度类分隔符跨度类内容此修订和更新的版本通过迭代构建向您展示了如何使用Grails一个独特的工作应用程序span跨度类分隔符span跨度image跨度类string跨度class分隔符span跨度class内容bklein cover jpg span跨度class分隔符span跨度title跨度class string跨度class分隔符span跨度class content编程Grails跨度class分隔符span跨度span类关键作者span跨度类字符串span跨度类分隔符span跨度类内容Burt Beckwith span跨度类分隔符跨度href跨度href字符串类跨度类分隔符跨度类内容HTTP商店oreilly com product跨度类分隔符跨度关于跨度类字符串跨度类分隔符跨度类内容深入挖掘Grails体系结构并发现此应用程序框架如何发挥其魔力跨度类分隔符跨度类关键字图像跨度类字符串跨度类分隔符跨度类内容bbeckwith cover gif跨度类分隔符跨度类关键字作为跨度类预定义类型列表跨度类预定义类型映射跨度类预定义类型字符串跨度类别预定义类型字符串跨度类别指令公共跨度类别指令最终跨度类别指令静态跨度跨度类预定义类型列表跨度类预定义类型映射跨度类预定义类型字符串跨度类预定义类型字符串跨度GROOVY BOOKS跨度类关键字标题跨度字符串跨度类分隔符跨度类内容制作Java Groovy跨度类分隔符跨度范围跨度类关键字作者跨度类字符串跨度类分隔符跨度类内容Ken Kousen跨度类分隔符跨度跨度类关键字href href跨度类字符串跨度类分隔符跨度类内容http www manning com kousen跨度跨度类分隔符跨度跨度关于span的class键span字符串string span class分隔符span span类的内容通过添加Groovy使Java开发更加轻松每章都着重介绍Java的任务开发人员喜欢构建测试或使用数据库或静态Web服务,并展示了Groovy如何使这些任务更轻松。span span class delimiter span span class class key image span class string string span class delimiter span span class content Kousen MJG png span span class delimiter跨度跨度类键标题跨度类字符串跨度类分隔器跨度类内容Groovy in Action nd Edition跨度跨度类分隔器跨度跨度类密钥作者跨度类字符串跨度类分隔器跨度类内容Champeau Hamlet D跨度类char跨度类内容Arcy Erik Pragt和Jon Skeet跨度类定界符跨度跨度跨度类key href跨度
    <> 那么="布局" 内容="主要" />


<> ID="内容" 角色="主要">
    <> ="行紧身衣">
        <> ="bookList" ="">
            <> 控制者="" ID="书号" 行动="节目">
                <> src="书本图片" 宽度="200" />
            
        
    

接下来,我们将创建一个显示gsp也在查看书籍这样,当我们选择一本书时,我们可以查看其详细信息

365bet地区应用程式观看次数显示gsp


    span bookInstance标题span类标记
    <> 那么="布局" 内容="主要" />


<> ID="内容" 角色="主要">
    <> ="行紧身衣">
        <> 测试="bookInstance">
            

<> href="bookInstance href">bookInstance标题 <> 控制者="收藏" 行动="喜爱"> <> 那么="bookId" ="bookInstance ID"/> <> 类型="提交" ="btn btn默认" ="g消息代码簿收藏夹默认收藏夹"/>

bookInstance关于

<> ="书作者" args="bookInstance作者" 默认="通过"/> <> src="bookInstance图片" 宽度="200" />

在上面的代码中,我们将“收藏夹”按钮包装在已登录的支票中,因为只有登录后我们才能够收藏一本书

最后,我们通过添加一个简单的菜单将所有内容绑定到布局文件中,该菜单使我们可以选择所有我们喜欢的书或登录注销的书,将其添加到导航div和.

grails应用程序视图布局主要gsp
<> ="居中" 样式="余量: 像素 汽车;">
    <> 控制者="" 行动="指数">
        <> ="全部预订" 默认="所有"/>
    
    |
    <> 控制者="收藏" 行动="指数">
        <> ="最喜欢的书" 默认="收藏夹"/>
    
    |
    
        <> 模板="auth loginWithGoogle"/>
    
    
        <> 控制者="登出" 样式="显示: 排队;">
            <> 类型="提交" ="g消息代码"登出", 默认"登出")}"/>
        
    
<> 测试="即时消息"> <> ="信息" 样式="显示: ">即时消息

在上面的代码中,我们

我们创建一个模板来包含我们的链接,以通过Google触发我们的OAuth登录链接oauth验证春季安全休息插件并以我们正在使用的提供者结尾谷歌对于链接oauth对Google进行身份验证这会将您重定向到您已经熟悉的常规Google登录帐户选择

grails应用程序视图授权auth loginWithGoogle gsp
<> href="oauth对Google进行身份验证">
    <> src="电子邮件保护"
                 一切="g消息代码"登录谷歌", 默认"登录  谷歌")}" 高度="40"/>
电子邮件保护已在资产中为您提供

运行已完成的应用

使用Gradle运行应用bootRun任务

gradlew bootRun

像以前一样现在我们的应用程序正在运行HTTP本地主机看到以下

主屏幕

选择一本书,看看没有喜爱未登录时可用

未经授权的表演

请点击用谷歌登录从我们的菜单中选择您的帐户登录

谷歌登录

查看我们成功的登录信息

loginMessage

选择一本书,看看喜爱按钮现在可用

授权显示

单击注销,您将看到显示的注销消息

注销消息

下一步

为了进一步理解,请通读365bet地区365bet地区 Spring安全性休息春季安全核心文件资料

您需要365bet地区帮助吗

OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

Grails OCI团队