`
lijingzhi
  • 浏览: 43238 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

20130116-使用Grails Shiro Plugin实现身份验证02

 
阅读更多

上一篇把Shiro部署到Grails上了,并且可以正常运行,虽然可以使用grails generate-all domain方式生成CRUD的脚手架增加用户或角色,但是出于业务的角度考虑,我们不希望所有人都可以增加用户信息,所以,我们新增加一个注册的功能,供没有账号的人注册自己的个人资料,而有admin权限的人可以登录到系统使用CRUD去维护这些账户信息。

注册

  • 现在创建一个SignupController,用来处理注册过程
$grails create-controller com.example.SignupController
  • 在Controller中增加注册方法
 1 package com.example
 2 
 3 import org.apache.shiro.authc.UsernamePasswordToken
 4 import org.apache.shiro.SecurityUtils
 5 
 6 class SignupController {
 7     def shiroSecurityService
 8 
 9     def index() {
10         User user = new User()
11         [user: user]
12     }
13 
14     def register() {
15         // Check to see if the username already exists
16         def user = User.findByUsername(params.username)
17         if (user) {
18             flash.message = "User already exists with the username '${params.username}'"
19             redirect(action:'index')
20         } else { // User doesn't exist with username. Let's create one
21             // Make sure the passwords match
22             if (params.password != params.password2) {
23                 flash.message = "Passwords do not match"
24                 redirect(action:'index')
25             } else { // Passwords match. Let's attempt to save the user
26                 // Create user
27                 user = new User(username: params.username,passwordHash: shiroSecurityService.encodePassword(params.password))
28 
29                 if (user.save()) {
30                     // Add USER role to new user
31                     user.addToRoles(Role.findByName('ROLE_USER'))
32                     // Login user
33                     def authToken = new UsernamePasswordToken(user.username, params.password)
34                     SecurityUtils.subject.login(authToken)
35 
36                     redirect(controller: 'home', action: 'secured')
37                 }else {}
38             }
39         }
40     }
41 }
  • 在这个Controller中定义了index和register两个action
  • index action用来显示注册界面
  • register action处理注册结果,如果注册成功则redirect到HomeController下的secured action

下面增加一个index.gsp界面,当访问http://localhost:8080/shiro-example/home/index时跳转到注册界面

 1 <%@ page contentType="text/html;charset=UTF-8"%>
 2 <html>
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 5 <title>Register</title>
 6 <meta name="layout" content="main" />
 7 </head>
 8 
 9 <body>
10     <h1>Signup</h1>
11     <g:if test="${flash.message}">
12         <div class="alert alert-info">${flash.message}</div>
13     </g:if>
14     <g:hasErrors bean="${user}">
15         <div class="alert alert-error"><g:renderErrors bean="${user}" as="list" /></div>
16     </g:hasErrors>
17 
18     <g:form action="register">
19         <fieldset class="form"><g:render template="register"/></fieldset>
20         
21         <fieldset class="buttons">
22             <g:submitButton name="submit" value="Submit"/>
23         </fieldset>
24     </g:form>
25 
26 </body>
27 </html>

在这里,使用<g:render template="register"/>引用了一个register模板,grails会去view下的当前gsp文件的相同目录中去找_register.gsp文件。所以,再建一个_register.gsp文件,定义表单内容

 1 <%@ page import="com.example.User" %>
 2 
 3 <div class="fieldcontain ${hasErrors(bean: userInstance, field: 'username', 'error')} required">
 4     <label for="username">
 5         <g:message code="user.username.label" default="Username" />
 6         <span class="required-indicator">*</span>
 7     </label>
 8     <g:textField name="username" required="" value="${userInstance?.username}"/>
 9 </div>
10 
11 <div class="fieldcontain ${hasErrors(bean: userInstance, field: 'passwordHash', 'error')} required">
12     <label for="password">Password</label>
13     <span class="required-indicator">*</span>
14     <g:passwordField name="password" value=""/>
15 </div>
16 
17 <div class="fieldcontain ${hasErrors(bean: userInstance, field: 'passwordHash', 'error')} required">
18     <label for="password">Confirm Password</label>
19     <span class="required-indicator">*</span>
20     <g:passwordField name="password2" value=""/>
21 </div>
分享到:
评论

相关推荐

    grails-shiro-ui:Grails Shiro UI 插件

    1. 添加依赖:在Grails项目的`build.gradle`文件中添加插件依赖,如`compile 'org.grails.plugins:grails-shiro-ui:版本号'`。 2. 配置Shiro:在`Config.groovy`文件中配置Shiro的设置,包括安全 Realm、认证策略、...

    elasticsearch-grails-plugin, 恢复的ElasticSearch grails插件.zip

    elasticsearch-grails-plugin, 恢复的ElasticSearch grails插件 Elasticsearch插件插件这个项目是一个基于Elasticsearch的插件,这个项目是基于的人完成的伟大工作的。你为什么想要为原来的Elasticsearch插件提供...

    grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip

    总之,"grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip"提供了一个宝贵的资源,让开发者有机会学习和实践Grails的ORM功能和Android的MVC设计模式。无论是对Grails框架的探索,还是对Android开发的深化,这...

    Grails入门指南 -- 针对grails1.0.4更新

    ### Grails入门指南知识点 #### 一、Grails框架简介 - **背景**: Grails是一个基于Groovy语言的开源Web应用框架,适用于Java平台。它旨在简化开发过程,提高开发效率,尤其受到那些希望保留Java环境同时寻求更高效...

    grails-plugin-converters-2.3.1.zip

    Grails Plugin Converters 2.3.1 和 Box Java SDK v2 是两个在开源世界中备受关注的工具,它们各自在不同的领域提供强大的功能,而将两者结合使用,可以为开发者带来更丰富的功能和更高效的工作流程。 Grails ...

    Grails plugin: Calendar

    总的来说,"Grails plugin: Calendar"是Grails框架的一个实用扩展,它为构建时间管理功能提供了便利。通过了解和使用这个插件,开发者可以快速创建具有强大日历功能的Web应用,同时得益于Grails的灵活性和Groovy语言...

    Apache-Shiro-使用手册

    Apache-Shiro-使用手册 Apache Shiro 是一个框架,可用于身份验证和授权。本文提供了几个示例用来展示如何在 Java™ 应用程序中使用 Shiro 并给出了如何在一个 Grails web 应用程序中使用它的概述。

    grails-plugin-controllers-2.3.3.zip

    标题中的"grails-plugin-controllers-2.3.3.zip"是一个Grails插件的版本包,主要关注的是Grails框架中的控制器部分。Grails是一个基于Groovy语言的开源Web应用框架,它构建在Java平台上,旨在提高开发效率。这个插件...

    Getting-Started-with-Grails-Chinese

    5. **GSP(Grails Server Pages)和模板引擎**:描述 Grails 如何通过 GSP 实现视图层,以及模板和标签库的使用方法。 6. **Grails 插件系统**:介绍插件的安装、使用和开发,以及它们如何增强 Grails 应用的功能。...

    open-dolphin-grails-plugin:支持您将 grails 应用程序海豚化

    用于 Open Dolphin 的 Grails 插件 该插件可帮助您使用 grails 开发 Open-Dolphin 应用... grails-app/conf/BuildConfig.groovy .. . grails . project . dependency . resolution = { .. . plugins { .. . comp

    harmonyos2-grails-hibernate-search-plugin:将HibernateSearch功能集成到Grails

    Grails Hibernate 搜索插件 这个插件旨在通过几个步骤将 Hibernate Search 功能集成到 Grails 中。 入门 如果你不想从 开始,你可以开始一个新的项目: 并将以下内容添加到您的依赖项中 compile("org.grails.plugins...

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2 共两个包,解压后需要将扩展名.zip.bak改名为.zip重新解压。 http://dist.springsource.com/release/STS/3.8.1.RELEASE/dist/ e4.6/spring-tool-...

    grails-gradle-plugin

    classpath " org.grails:grails-gradle-plugin:2.1.2 " } } version " 0.1 " group " example " apply plugin : " grails " repositories { grails . central() // creates a maven repo for the Grails Central ...

    elasticsearch-grails-plugin-sample:grails 弹性搜索插件的示例应用程序

    如何为了充分理解用本项目实现的不同案例之间的关系,建议按以下方式使用: 通过更改Config.groovy的选项来试验不同的可用客户端模式域此应用程序中的域尝试广泛使用插件提供的映射选项。 要查找特定映射,请参阅...

    Getting-Started-with-Grails-Chinese.rar_Getting Started_grails

    本书将引导读者逐步了解Grails的基本概念和实践操作,包括环境搭建、创建第一个Grails应用、控制器和视图的使用、服务层的实现、领域模型的定义、数据库交互、GORM(Grails Object-Relational Mapping)框架的使用...

    java8-temporal-grails-plugin:Grails插件,可与Grails一起使用Java8新的Date API(Instant,LocalDate等)

    Java8 Temporal Grails插件 Java 8时态插件在Grails中集成了Java 8的新DateTime API(Instant,LocalDate,LocalTime等)。 该插件与Grails 2.5.x(支持JDK8的Grails的第一个版本)兼容。 提供将输入绑定到Java 8 ...

    Eclipse下搭建Grails项目

    - 由于Grails项目涉及GSP(Groovy Server Pages)文件,推荐使用包含JSP编辑器的Eclipse JEE版本。如果你对JSP语法熟悉且内存有限,也可选择Classic版本。 - 安装Eclipse 3.4.0 JEE版本或其他支持JSP编辑的最新...

Global site tag (gtag.js) - Google Analytics