显示导航

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

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

s本·莱茵·塞尔吉奥·德尔阿莫

365bet地区版本 3.3.5

入门

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

您将需要什么

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

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

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

如何完成指南

要开始,请执行以下操作

要么

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

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

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

要完成指南,请转到初始

  • 光盘进入grails指南grails oauth twitter初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails oauth twitter完整

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

伪造默认

OAuth验证

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

设置和配置Twitter OAuth

要在应用程序上启动并运行Twitter OAuth,需要在服务器上进行一些工作和配置。Twitter开发人员控制台继续并登录并单击应用

开发者主页

选择开始使用标准权限

twitterDevApply

这为您提供了有关如何将您的应用程序连接到Twitter的快速描述。单击链接应用程序twitter com.

开发者标准版

这将带您到Twitters应用管理

twitterApps首页

在“ Twitter应用程序管理”页面上,单击创建新应用

Twitter不接受本地主机所以给它一个本地主机的IP地址127.0.0.1.

填写表格,并附上应用名称的基本说明,您的网址和您希望登录后Twitter返回的回调,然后单击创建您的Twitter应用程序.

twitterAppCreate

现在,您应该看到您的应用已通过Twitter成功创建

twitterAppCreateSuccess

接下来选择密钥和访问令牌标签

twitterKeysAndTokens

这是在Twitter中需要完成的所有设置。保存您的Consumer Key和Secret以供以后快速访问现在,我们将看一下使用Twitter凭据设置应用程序

设置您的应用

完成所有Twitter配置后,就可以配置我们的应用程序以使用安全性,并通过Twitter使用基于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 auth成功令牌${tokenValue}" } (4)Twitter客户端组织pac j oauth客户端TwitterClient(5)'推特键' (6)秘密'推特秘密' (7)defaultRoles[] (8)providerNames'onymousAuthenticationProvider'] (9)
                }
        }
}
1 您必须禁用承载令牌支持才能注册自己的tokenReader实现
2 365bet地区启用对使用365bet地区 Spring Security Rest插件过滤器的URL的匿名访问
3 用于签署JWT令牌的必需机密
4 通过Twitter认证后的回调URL,此回调URL将通过JWT令牌进行调用,该JWT令牌可对用户进行身份验证
5 在我们的案例中使用哪个pac j客户端Twitter客户端
6 提供您的Twitter使用者密钥API密钥作为系统属性推特键当您启动应用程序时
7 提供您的Twitter Consumer Secret API Secret作为系统属性推特秘密当您启动应用程序时
8 Twitter身份验证用户获得的特定角色
9 我们将仅针对Twitter对用户进行身份验证,因此,我们仅使用匿名身份验证提供程序。身份验证提供者Spring Security Core插件文档中的内容

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

gradlew DTWITTER密钥XXXXXX DTWITTER秘密XXXX bootRun

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

grails应用配置会议应用程序
匿名过滤器'AnonymousAuthenticationFilter restTokenValidationFilter restExceptionTranslationFilter filterInvocationInterceptor' (1)grails插件springsecurity filterChain chainMap: 'dbconsole',      过滤器: '没有'],
                [: '资产',      过滤器: '没有'],
                [: 'js',       过滤器: '没有'],
                [: '的CSS',      过滤器: '没有'],
                [: '图片',   过滤器: '没有'],
                [: '网站图标', 过滤器: '没有'],
                [: '/', 过滤器匿名过滤器(1)
                [: '书展', 过滤器匿名过滤器(1)
                [: 'book最喜欢的索引', 过滤器匿名过滤器(1)
                [: '验证成功', 过滤器匿名过滤器(1)
                [: 'oauth验证Twitter', 过滤器匿名过滤器(1)
                [: 'oauth回调Twitter', 过滤器匿名过滤器(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我们在该页面中未包括用于通过Twitter登录的按钮,因为我们已在根布局中将该按钮包括在主gsp em文件中p div h id注销注销处理程序h div类贡献btn按钮类型btn btn默认onclick窗口位置href https github com grails指南grails oauth twitter编辑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 dd到Spring Security Core插件的自定义注销处理程序插件代码注销处理程序名称代码p div div类清单block div类标题grails应用程序conf应用程序groovy div div类内容content pre class CodeRay高亮代码数据lang groovy grails插件springsecurity注销处理程序Names span class string string span class delimiter跨度跨度类内容RememberMeServices跨度跨度类分隔符跨度跨度类字符串跨度类分隔符跨度类跨度内容securityContextLogoutHandler跨度跨度类分隔体跨度跨度类字符串跨度类分隔器跨度类内容cookieClearingLogoutHandler跨度跨度类分隔符跨度跨度代码pre div div h id authController JWT Cookie h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth twitte r编辑master src主要文档指南authController adoc i类fa fa铅笔平方oi改进此doc按钮div div类段落p创建代码AuthController groovy代码当用户使用Twitter代码成功登录时,调用AuthController成功代码p div div类admonitionblock note表tr td类图标i类fa图标注释标题说明i td td类内容代码应用程序中的代码frontendCallbackUrl代码中使用了AuthController成功代码的路径groovy代码td tr表div div类listlisting div div类标题grails应用程序演示AuthController groovy div div div类的内容课前课CodeRay高亮代码数据lang groovy span class关键字package span demo span class关键字import span span class include grails config Config span span class关键字import span span class include grails核心支持G railsConfigurationAware span span class关键字import span span class include grails插件springsecurity注解Secured span span class关键字import span span class include grails插件springsecurity rest令牌读取器TokenReader span span class关键字import span span class include groovy util logging Slf j span span class关键字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类class字符串span类定界符span类类别内容GET span类限定符spa n跨度类关键字退出跨度类字符串跨度类分隔符跨度类内容POST跨度类分隔符跨度类间距注释固定跨度类字符串跨度类定界符跨度类内容允许所有跨度类分隔符跨度类关键字def跨度类函数成功跨度类预定义类型字符串跨度令牌日志调试跨度类字符串跨度类定界符跨度类内容令牌值跨度类定界符跨度令牌跨度类关键字如果跨度令牌cookie cookie jwtCookie令牌响应addCookie cookie i class conum数据值ibb跨度类关键字grailsS​​erverUrl跨度grailsS​​erverUrl跨度类指令受保护的跨度Cookie jwtCookie跨度类pre定义的类型String span tokenValue Cookie jwtCookie span类关键字new span cookie cookieNameNameValueValue jwtCookie maxAge jwtExpiration i类conum数据值ibb jwtCookie路径span类字符串span类定界符span类内容content span类分隔符span类jwtCookie setHttpOnly httpOnly i类conum数据值ibb span class关键字if span httpOnly jwtCookie setSecure span类预定义常量true span i类conum数据值ibb jwtCookie span类注解覆盖span类类型void span set setConfiguration config co jwtExpiration co getProperty span类字符串string span类分隔符span span类内容grails插件springsecurity rest令牌存储memcached到期跨度跨度类定界er span span span类预定义类型整数span span class整数span i类conum数据值ibb grailsS​​erverUrl co getProperty span class字符串span class定界符span span类内容grails serverURL span span class定界符span span span类预定义类型String span span class指令protected span span类类型boolean span httpOnly grailsS​​erverUrl startsWith span类string span类定界符span span类内容https span类class定界符span span类指令受保护的span类预定义类型String span cookieName span类关键字,如果span tokenReader span类关键字instanceof span JwtCookieTokenReader span类关键字返回span JwtCookieTokenReader tokenReader cookieName i类conum数据值i bb span class关键字return span span class字符串span span class delimiter span span class content jwt span span class class delimiter span span code pre div div div div class colist阿拉伯语表tr td i类conum数据值ibb td td用JWT令牌响应Cookie值td tr tr td i类conum数据值ibb td td响应具有相同名称和代码的cookie maxAge代码等于删除cookie,因此它注销了用户td tr tr td i类conum数据值ibb td td阻止执行任何Javascript在您的站点中,甚至您自己的javascript都可以编写文档cookie的代码并访问cookie td tr tr td i类conum数据值ibb td td如果您使用http而不是https则cookie不会离开您应该在生产td tr tr td中使用https我分类conum数据值ib b td td设置cookie过期以匹配JWT过期td tr tr td i类conum数据值ibb td td使用相同的cookie名称,自定义代码tokenReader我们之前定义的代码期望td tr表div div类admonitionblock注意表tr td类图标i类fa图标注释标题注意i td td类内容由于此应用程序安全解决方案的无状态性质,要注销用户,需要删除包含其JWT令牌的cookie td tr表div div类段p GSP代码成功代码操作执行简单的重定向到主页,我们在客户端进行重定向,以确保正确设置了cookie p div div类清单listingblock div类标题grails应用程序视图auth成功gsp div div类内容pre class CodeRay高亮代码数据lang groovy html head meta http equiv span class string sp类分隔符span跨度class内容刷新span跨度class分隔符span跨度content span类别string跨度class delimiter跨度class content url span跨度class inline span类别inline分隔符span grailsS​​erverUrl span类别string跨度class delimiter span跨度class content http localhost跨度span类分隔符span跨度span类inline分隔符span跨度class内容span跨类delimiter跨度span regreg span跨类delimiter跨度class content头span跨度class error跨度body跨度class key g span消息代码span跨度class string跨度class分隔符跨度跨度类内容重定向跨度跨度类分隔符跨度跨度类关键字默认跨度字符串跨度类分隔符跨度类内容重定向跨度类分隔符span span span span class regexp span class delimiter span span class content body span span class error error span span class regexp span class delimiter span span class content html span span code pre div div h id logging增强日志记录h div class贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth twitter编辑主src主要文档指南记录adoc i类fa fa铅笔平方oi改进此doc按钮div div类段落p如果您要启用增强日志记录功能您可以看到调用Twitter OAuth api时返回的内容,然后在代码末尾添加以下内容。groovy代码文件p div div类listinglistdiv div类标题grails app conf logback groovy div div类内容pre class CodeRay高亮代码数据lang groo vy记录器跨度类字符串跨度类分隔符跨度跨度内容org org springframework安全跨度类跨度分隔符跨度DEBUG跨度类字符串跨度类分隔符跨度跨度类内容STDOUT跨度类分隔符跨度跨度跨度类预定义常数false跨度记录器跨度类字符串跨度类分隔符span span class content grails插件springsecurity span span class delimiter span span DEBUG span class string span span class delimiter span span class content STDOUT span span class delimiter span span span class预定义的常量false span记录器span class string string span class delimiter 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 delimiter span span span class预定义的常量t错误的跨度代码pre div div h id buildingTheApp构建应用程序h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth twitter编辑master src主要文档指南buildingTheApp adoc i类square oi改进此doc按钮div div类段落p我们将快速组装一个列出书并允许我们收藏它们的应用程序。仅当我们使用Twitter登录后,收藏按钮才可用p div h id domain Your Domain h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth twitter编辑master src主要文档指南域adoc i类fa fa铅笔平方oi改进此doc按钮div div类段落p对于您的域我们将需要领域对象代码书代码和书代码收藏夹代码创建如下,如下所示:p div div类清单listblock div类标题grails应用程序域演示书groovy div div类内容pre class CodeRay高亮代码数据lang groovy span类关键字包span演示span类关键字import span span类include grails编译器GrailsCompileStatic span span类注释GrailsCompileStatic span span类类型class span span类类book span span class预定义类型String span image span class预定义类型String span title span class预定义类型String span author作者span class预定义类型String span span类预定义类型字符串span href href span class指令static span mapping图像span class key nullable span span class预定义常量false span span title span class key nullable span span c lass预定义常量false跨度作者span类关键字可为空span类别预定义常量false跨度为span类关键字为null的span跨距类预定义常量false span href跨度类关键字nullable span跨度类预定义常量false span关于跨度类键类型span跨度类字符串跨度类定界符跨度类内容文本跨度类定界符跨度代码pre div div div class listingblock div class title grails应用领域演示BookFavourite groovy div div div content content pre class CodeRay Highlight Code data lang groovy span class class package 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 BookFavourite span span class pr预先定义的类型长跨度bookId跨度类预定义类型字符串跨度用户名跨度类指令静态跨度约束bookId跨度类关键字可空跨度跨度类预定义常数false跨度用户名跨度类密钥可空跨度跨度类预定义常量错误跨度代码pre div div h id data数据h div类贡献btn按钮类型按钮类btn btn默认onclick窗口位置href https github com grails指南grails oauth twitter编辑主src主要文档指南数据adoc i类fa fa铅笔平方oi改进此doc按钮div div类段落p在至此,我们将创建图书数据,以便继续进行一些工作。继续,使您的代码BootStrap groovy代码与以下p div div类admonitionblock注意表tr td类图标i class fa图标匹配note标题注释i td td类内容所需的图像资源已添加到您的初始项目中td tr表div div类listblock div类标题grails应用程序初始化演示BootStrap groovy div div类内容pre class CodeRay高亮代码数据lang groovy span类关键字包跨度演示跨度类关键字导入跨度类包括groovy变换CompileStatic跨度类注释CompileStatic跨度类类型类跨度类类BootStrap跨度类指令公共跨度类指令最终跨度类指令静态跨度类预定义类型列表跨度类预定义类型地图跨度类预定义类型字符串跨度类预定义类型字符串跨度GRAILS BOOKS标题跨度类字符串跨度类定界符span span cla ss内容Grails分步跨度跨度类分隔符跨度跨度类关键字作者跨度类字符串跨度类分隔符跨度跨度类内容Cristian Olaru跨度类分隔符跨度跨度类关键字href跨度类字符串跨度类分隔符跨度类内容https grailsthreebook com跨度类分隔符跨度有关跨度类字符串跨度类定界器跨度类内容了解使用Grails使用配置文件和插件如何快速有效地实现完整的未开发应用程序。使用本书随附的示例应用程序作为跨度示例span class delimiter span span span class key image span span class字符串span class delimiter span span class content grails一步一步png span span class delim iter跨度标题跨度类字符串跨度类分隔符跨度内容实用Grails跨度类分隔符跨度跨度关键类作者作者跨度类字符串跨度类分隔器跨度类内容类分隔符span跨度类内容https www grails书com span跨度class分隔符span跨度关于span类字符串span跨度class delimiter跨度span类内容学习第一本专门针对Grails的书来构建Grails应用程序的基本概念实际的最新代码示例是提供,因此您可以轻松地沿跨度跨度类定界符跨度跨度跨度类关键图像跨度类字符串跨度类分隔符跨度类内容实用grails书籍封面png跨度跨度类分隔符跨度标题跨度字符串跨度类分隔符跨度类别内容Falando de Grails跨度类别分隔符跨度跨度跨度类关键字作者跨度类别跨度字符串跨度类分隔符跨度跨度类内容Henrique Lobo Weissmann跨度类分隔符跨度href href跨度类字符串跨度类分隔符跨度类内容http://www.casadocodigo.com/livro grails跨度类分隔符跨度关于跨度类字符串跨度类分隔符跨度类内容这是关于Grails的最佳参考,用葡萄牙语编写,它是处理许多用户往往忽略的细节的框架的出色指南跨度跨度类分隔器跨度跨度类关键图像跨度类别字符串跨度类分隔器跨度跨度类别内容grails weissmann png跨度类分隔器跨度跨度标题跨度类字符串跨度类分隔器跨度跨度类内容Grails跨度类的主要作者跨度类的字符串跨度类的分隔符跨度类的内容Hubert A Klein Ikkink跨度跨度类的分隔符跨度href href跨度类字符串跨度类分隔符跨度类内容https leanpub com grails善良笔记本跨度类分隔符跨度跨度跨度类字符串跨度类分隔符跨度类内容通过代码片段D体验Grails框架通过代码示例和简短的文章,发现隐藏的Grails功能。这些文章和代码将带您快速入门,并深入了解Grails span span class delimiter span span span class key image span span class string string span class delimiter span span class content grailsgood png span span类定界符span跨度title跨度类string跨度class delimiter跨度span类内容The Grails权威指南span跨度class delimiter span跨度class key作者span类字符串span类class delimiter span跨度class content Jeff Scott Brown和Graeme Rocher span跨度class分隔符跨度span href跨度类字符串string跨度类delimiter跨度span类内容http www apress com span跨度类delimiter span跨度关于跨度类字符串跨度类定界符跨度类内容如标题所示,这是在Grails框架上由开发团队的核心成员编写的权威性参考。跨度类定界符跨度跨度类关键图像跨度类字符串跨度类定界符跨度类内容grocher jbrown Cover jpg跨度类分隔符跨度标题跨度类字符串跨度类分隔符跨度类内容Grails in Action跨度类分隔符跨度类关键作者跨度类字符串跨度类分隔符跨度类内容Glen Smith和Peter Ledbrook范围跨度类分隔符范围跨度href跨度类字符串跨度类分隔符跨度类内容http w ww manning com gsmith span span class delimiter span span about span class字符串span class classlimiter span span class content第二版Grails in Action是Grails的全面介绍,其重点是帮助您成为超高效的快速span span class delimiter span span span class关键图像范围跨度类字符串跨度类定界符跨度类内容gsmith Cover jpg跨度类定界符跨度标题跨度类字符串跨度类定界符跨度类内容Grails快速入门指南跨度类定界符跨度范围跨度范围关键作者跨度类字符串span分隔符span分隔符span内容Dave Klein和Ben Klein span分隔符span分隔符span分隔符href span类别字符串跨度类定界符跨度类内容http://www.amazon.com gp产品标签跨度跨度类定界符跨度关于跨度类字符串跨度类定界符跨度类内容本修订和更新的版本通过迭代构建独特的工作原理向您展示了如何使用Grails。应用范围跨度类分隔符跨度图像跨度类字符串跨度类分隔符跨度类内容bklein cover jpg跨度类分隔符跨度标题跨度类字符串跨度类分隔符跨度类内容编程Grails跨度类分隔符跨度类关键作者跨度跨度类字符串跨度类分隔符跨度类内容Burt Beckwith跨度跨度类分隔符跨度跨度href跨度类字符串跨度类定界符跨度类内容http shop oreilly com product do跨度类定界符跨度关于跨度类字符串跨度类定界符跨度类内容深入挖掘Grails体系结构,并发现此应用程序框架如何发挥其神奇的跨度类分隔符span跨度span class关键图像跨度class字符串span跨度class delimiter跨度span class content bbeckwith cover gif span跨度class delimiter span跨度span class关键字as span跨度class预定义类型List span跨度类预定义类型Map span跨度类预定义类型String跨度类预定义类型字符串跨度类指令公共跨度类指令最终跨度类指令静态跨度类预定义ty pe列表span跨度类预定义类型Map span跨度类预定义类型String span跨度类预定义类型String span GROOVY BOOKS span类别键title span跨度类string跨度类定界符span跨度类内容制作Java Groovy span跨度类定界符span跨度类关键作者跨度类字符串跨度类分隔符跨度类内容Ken Kousen跨度类分隔器跨度类间距跨度类关键字href跨度类字符串跨度类分隔器跨度类内容http www manning com kousen跨度类分隔符跨度类关键字span跨度类字符串span跨度类定界符span跨度类内容通过添加Groovy使Java开发更加轻松每章都着重于Java开发人员喜欢buildi的任务ng测试或使用数据库或静态Web服务,并展示了Groovy可以使这些任务更容易的方法。span span class delimiter span span span class key image image span class string string span class delimiter span span content content Kousen MJG png span span class delimiter span span span类关键字标题跨度类字符串跨度类分隔器跨度类内容Groovy in Action nd Edition跨度类分隔器跨度跨度类密钥作者跨度类字符串跨度类分隔器跨度类跨度内容DierkKönigGuillaume Laforge Paul KingCédricChampeau Hamlet D跨度类char跨度类内容Arcy Erik Pragt和Jon Skeet跨度类定界符跨度跨度类关键字href跨度类字符串跨度类
    <> 那么="布局" 内容="主要" />


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

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

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


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


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

<> href="bookInstance href">bookInstance标题 <> 控制者="收藏" 行动="bookFavourite null最不喜欢的收藏"> <> 那么="bookId" ="bookInstance ID"/> <> 测试="收藏"> <> 类型="提交" ="btn btn默认" ="g消息代码本不利于默认不利于"/> <> 类型="提交" ="btn btn默认" ="g消息代码簿收藏夹默认收藏夹"/>

bookInstance关于

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

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

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

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

在上面的代码中,我们

我们创建一个模板来包含我们的链接,以通过Twitter触发我们的OAuth登录链接oauth验证春季安全休息插件并以我们正在使用的提供者结尾推特对于链接oauth验证Twitter这会将您重定向到您已经熟悉的普通Twitter登录页面。

365bet地区应用程序视图身份验证登录使用Twitter gsp
<> href="oauth验证Twitter">
    <> src="用Twitter登录png"
                 一切="g消息代码"登录twitter", 默认"登录  推特")}" 高度="10"/>
用Twitter登录png已在资产中为您提供

运行已完成的应用

使用Gradle运行应用bootRun任务

gradlew bootRun

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

主屏幕

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

未经授权的表演

请点击用Twitter登录从我们的菜单中输入您的Twitter凭据

Twitter登录

成功重定向后,您可以检查并发现存储为Cookie的JWT令牌

曲奇饼

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

授权显示

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

注销消息

下一步

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

您需要365bet地区帮助吗

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

免费咨询

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

Grails OCI团队