首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Grails应用程序中实现"记住我"

在Grails应用程序中实现"记住我"功能,可以通过使用Spring Security插件来实现。Spring Security插件提供了一套完整的安全解决方案,包括认证、授权和"记住我"功能。

以下是在Grails应用程序中使用Spring Security插件实现"记住我"功能的步骤:

  1. 安装Spring Security插件:在Grails应用程序的根目录下运行以下命令来安装Spring Security插件:grails install-plugin spring-security-coregrails.plugins.springsecurity.userLookup.userDomainClassName = 'com.example.User' grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'com.example.UserRole' grails.plugins.springsecurity.authority.className = 'com.example.Role' grails.plugins.springsecurity.controllerAnnotations.staticRules = [ '/': ['permitAll'], '/index': ['permitAll'], '/index.gsp': ['permitAll'], '/**/js/**': ['permitAll'], '/**/css/**': ['permitAll'], '/**/images/**': ['permitAll'], '/**/favicon.ico': ['permitAll'] ] grails.plugins.springsecurity.filterChain.chainMap = [ '/assets/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter', '/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter' ]package com.example class User implements Serializable { String username String password boolean enabled = true boolean accountExpired = false boolean credentialsExpired = false boolean accountLocked = false Set<Role> getAuthorities() { UserRole.findAllByUser(this).collect { it.role } as Set } static constraints = { username blank: false, unique: true password blank: false } static mapping = { password column: '`password`' } } package com.example class Role implements Serializable { String authority static constraints = { authority blank: false, unique: true } } package com.example class UserRole implements Serializable { User user Role role static constraints = { } } package com.example class UserDetailsService implements GrailsUserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = User.findByUsername(username) if (!user) { throw new UsernameNotFoundException('User not found', username) } new org.springframework.security.core.userdetails.User(user.username, user.password, user.enabled, true, true, true, user.authorities) } }package com.example class LoginController { def index() { if (springSecurityService.isLoggedIn()) { redirect uri: '/' } else { [loginForm: new LoginCommand()] } } def authenticate() { def loginCommand = new LoginCommand() bindData(loginCommand, params.loginForm, [include: ['username', 'password', 'rememberMe']]) if (loginCommand.hasErrors() || !springSecurityService.authenticationSuccess()) { flash.message = 'Authentication failed. Please try again.' redirect action: 'index' } else { redirect uri: (springSecurityService.currentUser as User).getTargetUri() ?: '/' } } } package com.example class LogoutController { def index() { redirect uri: '/' } } package com.example class LoginCommand { String username String password boolean rememberMe static constraints = { username blank: false password blank: false } }<!DOCTYPE html> <html> <head> <meta name="layout" content="main"> <title>Login</title> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <g:if test="${flash.message}"> <div class="alert alert-danger">${flash.message}</div> </g:if> <g:form action="authenticate" class="form-horizontal"> <legend>Login</legend> <div class="form-group"> <label for="username" class="col-sm-2 control-label">Username</label> <div class="col-sm-10"> <input type="text" class="form-control" id="username" name="loginForm.username" placeholder="Username"> </div> </div> <div class="form-group"> <label for="password" class="col-sm-2 control-label">Password</label> <div class="col-sm-10"> <input type="password" class="form-control" id="password" name="loginForm.password" placeholder="Password"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox" name="loginForm.remember
  2. 配置Spring Security插件:在grails-app/conf/Config.groovy文件中配置Spring Security插件。例如,可以设置以下属性:
  3. 创建用户和角色类:在grails-app/domain目录下创建UserRole类,并实现UserDetailsService接口。例如:
  4. 创建登录和注销控制器:在grails-app/controllers目录下创建LoginControllerLogoutController类,并实现登录和注销功能。例如:
  5. grails-app/views目录下创建登录页面login/index.gsp和登录表单login/_form.gsp。例如:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SpringSecurity之记住功能的实现

SpringSecurity之记住功能的实现 Spring security记住基本原理: 登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后...image.png RememberMeAuthenticationFilterSpring Security认证过滤器链的倒数第二个过滤器位置,当其他认证过滤器都没法认证成功的时候,就会调用RememberMeAuthenticationFilter...image.png 实现: 1,登录表单加上,SpringSecuritySpringSessionRememberMeServices...里配置 4,BrowserProperties里加上自动登录时间,把记住时间做成可配置的 //记住秒数配置 private int rememberMeSeconds = 10; 以下是相关的配置... 到此我们来启动项目,首次访问http://localhost:8787/user会需要我们登录,这里我们进行登录先不勾选记住: ?

91320
  • 实战django(二)--登录实现记住

    上节初步实现了登录和注册模块,这节我们进一步实现记住”功能。...大体功能分为以下模块: 1.登录时如果勾选记住,那么就将用户username存进cookie,跳转到index页面; 2.此时,如果不进行登出,如果直接返回登录页面,那么就会判断cookie是否存在...username,如果存在,就直接跳转到Index界面,也就是不用再一次登录; 3.如果进行登出,则删除cookie的username,并返回登录界面; 4.如果登录时不勾选记住,那么跳转到index...界面后,访问登录界面不会继续跳转到Index界面; 5.若直接访问Index界面,会判断cookie是否存在username,如果不存在,则会提示对不起,请先登录,三秒之后跳转到登录界面。... 记住

    95920

    这是一种有关记住功能的新实现方式

    传统的前后端不分离项目中,大家登录界面应该经常能看到记住这个功能,这个功能本质上是为了让用户能在一段较长时间内不在重复登录,以前的实现方案,大家多使用 cookie 实现,本文给大家介绍引入了...本文使用 newbeepro 项目作为示例,给大家演示记住功能的具体实现。...我们可以 spring 的 yml 文件设置 session redis 的 key 前缀, newbeepro 项目中,我们设置为 newbee_mall,然后我们设置过期时间 3600...,我们可以通过 mallUserVO.isRememberme() 方法来判断用户是否点击了记住按钮,在前面的第三步,我们可以看到用户的 session redis 的 key 名称是 newbee_mall...总结一下本文给大家讲解了使用 spring-session-redis 的项目中,如何通过延长用户 session 的有效期来达到记住功能的一致效果。

    19110

    .NET 应用程序运行 JavaScript

    一想到要再次处理 Node.js 和 npm,就完全放弃了,所以我决定研究一下 .NET 应用程序运行 JavaScript 的可能性。很疯狂吧?实际上,这出乎意料的简单。...或者......我们直接从我们的 .NET 应用程序调用 JavaScript 2 .NET 运行 JavaScript 一旦你决定在你的 .NET 代码运行 JavaScript,你就会考虑几个选择...本节将展示如何使用 prism.js 高亮一小段代码,并在一个控制台应用程序运行。...5总结 在这篇文章展示了如何使用 JavaScriptEngineSwitcher NuGet 包来 .NET 应用程序运行 JavaScript。...最后,展示了你如何使用 JavaScriptEngineSwitcher .NET 应用程序内部运行 Prims.js 代码高亮库。

    2.6K10

    的WCF之旅(3):WCF实现双工通信

    实现了上面定义的服务契约ICalculator的服务CalculatorService实现了Add操作,完成运算和结果显示的工作。...结果显示是通过回调的方式实现的,所以需要借助于客户端提供的回调对象(该对象客户端调用CalculatorService的时候指定,介绍客户端代码的实现的时候会讲到)。...步骤三:服务寄宿 我们通过一个控制台应用程序完成对CalculatorService的寄宿工作,并将所有的服务寄宿的参数定义配置文件。...预定义绑定类型,WSDualHttpBinding和NetTcpBinding均提供了对双工通信的支持,但是两者在对双工通信的实现机制上却有本质的区别。...客户端程序为回调契约提供实现,在下面的代码CalculateCallback实现了回调契约ICallback,DisplayResult方法对运算结果进行输出。

    1.1K100

    是如何成为一个JavaWeb开发者的

    但是技术也是不断变化发展的。你会冒着学习的东西很快就会过时的风险吗?   客户端技术   建议新手开发人员可以从基础的学起;HTML,CSS和Java。这些技术是web开发的核心。...Hibernate是现在使用最广泛的JPA实现。作为一个Javaweb开发人员,你肯定要用到数据库。你要从数据库得到内容,以显示在网页上,或从用户那里接收内容存储到数据库。...的Spring入门在线教程上,对主要的Spring框架项目做了一个很好的概述,并说明了如何使用它们来构建企业级应用程序。   ...Grails   Grails是建立Spring之上的快速应用程序开发框架。它不但拥有Spring的所有内容,还借鉴了Groovy的生产力优势。...喜欢将Grails形容为用Groovy包装过的Spring。关键一点要记住的是,其背后依然是Spring。   Grails现在越来越受到企业的欢迎。

    96010

    IPA重签名iOS应用程序

    当我们在对iOS应用程序执行黑盒安全测试时,我们一般只能从AppStore来访问和获取iOS应用程序。但是大多数情况下,客户都会给我们提供一个IPA文件。...黑盒测试过程,我们无法访问目标应用的源代码,因此通过Xcode将其部署到设备并进行测试,几乎是不可能的。...获取正确的配置文件 Xcode的文件导航栏,选择“Product”,点击目标App。然后检查Xcode Inspector区域(Xocde界面的右侧面板),找到应用程序Bundle的路径。...应用程序Bundle,我们将会看到“embedded.mobileprovision”,然后把配置描述文件拷贝到当前的工作目录: $ cp PATH_YOU_GOT_FROM_XCODE/embedded.mobileprovision...Keychain): $ security find-identity -v -p codesigning 获取到所需信息之后,我们就可以对应用程序进行重签名了: $ codesign -f -s

    2.3K10

    Flutter制作指纹认证应用程序

    本文主要展示如何在 Flutter 为 android 应用程序实现指纹认证系统 现在许多手机都配备了指纹传感器,这使得用户登录和本地身份验证更容易,而且比使用密码更安全。...设置我们的项目 我们开始编写应用程序之前,我们需要先设置一些东西。...我们需要做的第一件事是我们的 pubspec.yaml 文件添加 local_auth 依赖项 所以对于我的项目,使用了这个版本,但你可能会使用最近的版本,所以我建议你检查这个链接,看看你可以使用哪个版本...我们的示例,我们只会为 Android 手机实现此功能,对于 IOS 则不一样,但是您可以通过访问以下链接的文档来了解如何执行此 操作。...现在我们已经完成了应用程序的主要部分,让向您展示完整的源代码。

    2.5K10

    python 方法太多了,怎么记住 JupyterNotebook这几招很有用

    ---- 前言 很多初学者学习一些 python 库的时候,最难受的事情莫过于记不住大量的函数或方法名字,实在说,自己也是时常忘记。为什么?因为实在是太多方法了。...比如最常用的 pandas,就用上千个的方法,谁会这么无聊去记住他们。 今天就来把日常查阅库方法的技巧列出来。最后一招你肯定没有看过!...注意是英文的问号: 但是,可能根本不记得完整的方法名字。...不怕,他还支持模糊查询: 星号是通配符,表示任意内容 最后的问号表示查询的意思 此时我们就知道, DataFrame sort_ 开始的方法名就有这2个。...---- 此时,我们知道方法名字,要查阅方法的使用文档,可以用双问号: 注意,此时不能使用星号,而且必需输入完整的方法名字 这是以前经常使用的技巧。

    1.2K20

    是如何成为一个JavaWeb开发者的

    但是技术也是不断变化发展的。你会冒着学习的东西很快就会过时的风险吗?   客户端技术   建议新手开发人员可以从基础的学起;HTML,CSS和Java。这些技术是web开发的核心。...Hibernate是现在使用最广泛的JPA实现。作为一个Javaweb开发人员,你肯定要用到数据库。你要从数据库得到内容,以显示在网页上,或从用户那里接收内容存储到数据库。...的Spring入门在线教程上,对主要的Spring框架项目做了一个很好的概述,并说明了如何使用它们来构建企业级应用程序。   ...Grails   Grails是建立Spring之上的快速应用程序开发框架。它不但拥有Spring的所有内容,还借鉴了Groovy的生产力优势。...喜欢将Grails形容为用Groovy包装过的Spring。关键一点要记住的是,其背后依然是Spring。   Grails现在越来越受到企业的欢迎。

    88210

    基于Node.js的微服务应用程序实现API网关模式

    API 网关简化了客户端实现,增强了安全性,并优化了基于微服务的系统的通信。 API 网关模式有哪些优势? 使用 API 网关模式为应用程序提供了许多好处。...如何在 Node.js 实现 API 网关模式? 现在我们已经对 API 网关模式是什么以及它是如何工作的有了基本的了解,让我们看一下如何在 Node.js 实现一个。...方法 01:基于容器的实现(使用 Kubernetes 或 Docker) 让我们看看如何在 Docker 环境实现和部署 API 网关模式。 首先,应用程序创建了以下文件夹和文件结构。...这样可以控制台中看到类似于以下内容的输出。 你可以在这里找到 GitHub 仓库,了解其完整实现。 方法 02:服务网格实现 还可以将服务网格与 Node.js 一起用于实现 API 网关。...结论 总之,现代软件架构,采用 API 网关模式来实现微服务,成为提高可扩展性、灵活性以及整体效率的关键策略。

    10810

    Tensorflow.js:浏览器实现了迁移学习

    ⭐️ 本文首发自 前端修罗场,是一个由资深开发者独立运行的专业技术社区,专注 Web 技术、答疑解惑、面试辅导以及职业发展。...为了提供代码的示例,让我们重新利用之前的示例并对其进行修改,以便我们可以对新图像进行分类。 以下是此设置最重要部分的一些代码示例,但如果你需要查看整个代码,可以本文的最后找到它。...我们希望能够我们的头部向左或向右倾斜之间对网络摄像头输入进行分类,因此我们需要两个标记为 left 和 right 的类。...KNN 算法的 K 值很重要,因为它代表了我们确定新输入的类别时考虑的实例数。...在这种情况下,10 意味着,预测一些新数据的标签时,我们将查看训练数据的 10 个最近邻,以确定如何对新输入进行分类。 最后,我们得到了视频元素。

    74420

    wince测试驱动应用程序实现

    这里建的工程是MFC的smart device,选择ARMV4I的指令集,不同的设备可能会有轻微的不同,不过大体实现是一样滴。还有,这里选的应用类型是dialog base。   ...的资源视图的dialog里面添加消息也是可以的,这里用手动添加,另一种好像找不着这个消息。...然后PreTranslateMessage这个函数里面添加一个判断if(pMsg->message == ::RegisterWindowMessage(L"hello ce")) { 应用处理内容...DeviceIoControl(hread, IOCTL_WRITE_LED, NULL, 0, bTemp, 128, 0, (LPOVERLAPPED) NULL);就能够把数据写入到bTemp里面,这样就能读取驱动的数据...可能还有更好的办法,目前就只能用这种比较挫的方式。   界面比较简单,加几个按钮,控制led开关。 ?

    74740

    ThoughtWorks的敏捷实践

    我们团队,这个角色就是一开始提到的BA。她是IPM主要参与人,另外还有Tech Lead会一起参与讨论(团队每一个人成员都是可以参与进来的)。...比较推荐DEVkick off后将Story划分成子任务列表,按照依赖关系和优先级排序,逐个干掉他们。...通俗地讲,Pair就是两个人同时工作同一个Story上,一起讨论Story的解决方案,并编写代码实现功能,一个人敲键盘,一个人看屏幕,穿插着进行。...当两个人对实现细节的优劣拿捏不定时,邀请团队经验丰富的老人做出建议参考。 一些很简单的defect上,可以不采用Pair。...也经历过客户要求测试覆盖率的项目,有专门的测试覆盖率工具(coveralls)来检测代码库,有的甚至集成CI上作为一个硬性指标。 所以,TDD必须在一个有测试的项目中去讲。

    2K30

    Docker开发Java 8 Spring Boot应用程序

    本文中,将向您展示如何使用Java 8开发和运行简单的Spring Web应用程序,而无需本地计算机上安装Java 8。...不打算深入解释Docker的细节。您可以从Docker官方网站上找到基本信息和安装指南。 一旦你安装了Docker工具箱,你就不需要在我们的示例应用程序安装所需的Java 8或MySQL。...现在,您可以从GitHub 下载的代码。...在那个Java 8映像上,安装了vim,wget,curl,Maven,并且设置了这个卷以便把现有的项目编码。最后,执行Maven命令来运行应用程序。...MySQL映像上,放置了位于MySQL文件夹的db-schema创建脚本。在这个文件夹里有一个单一的SQL文件(data.sql)创建“人员”表。 现在,我们来看看应用程序结构。

    2.8K70

    CakePHP应用程序安装入侵检测系统

    还要记住,你可以轻松扩展插件,以便在收到攻击时执行其他操作。 插件版本0.1支持以下攻击反应: 日志:在数据库或日志文件记录攻击。 发送警报电子邮件:向管理员发送包含攻击信息的电子邮件警报。...禁止攻击者的IP:禁止ip访问你的应用程序。...安装说明 步骤1:下载并解压缩 将插件下载并解压缩到主应用程序插件文件夹[默认文件夹:app / plugins /] 步骤2:设置数据库表 如果要将数据库的入侵警报存储,请设置下 ?...要开始监视这个方法,你添加一行'$ this-> requestAction(“/phpids / phpids_intrusions / detect”);' 函数调用的开头。 ?...这些异常需要手动添加到PHPIDS配置文件。 打开你的PHPIDS配置文件并找到例外部分。

    2.1K70

    分享用Qt开发的应用程序【二】Qt应用程序中使用字体图标fontawesome

    voidSetIcon(QPushButton*ctl,QCharc,intsize=10); signals: publicslots: }; #endif//ICONHELPER_H 下面来看一下CPP文件的代码 应用程序所在目录下创建...res目录,并放置字体文件/res/fontawesome-webfont.ttf 然后加载到全局字体 #include"IconHelper.h" IconHelper*IconHelper::_...SetIcon(ui->RightBtn,QChar(0xf178),12); 详见:http://fontawesome.io/cheatsheet/ ----------------------- 又开发了一个桌面日历的小程序分享给大家...1、黑色背景是的桌面颜色,大家可以忽略 2、虽然右键菜单里写了“开机自启动”,但我并没有开发这个功能,请见谅 3、我会在下一篇文章里公布这个小程序的源码,敬请期待 4、这个小程序会始终在你的桌面上,

    1.8K70
    领券