1. 程式人生 > >grails-shiro許可權認證

grails-shiro許可權認證

一.引用shiro外掛

//在BuildConfig的plugins下面新增
compile ":shiro:1.2.1"

二.引用新外掛後要進行編譯

//grails命令
compile

三.生成腳手架檔案

//grials命令 , 要注意的是後面的那個點,否則生成好的檔案會混亂
shiro-quick-start --prefix=com.security.

四.配置Bootstrap.groovy

複製程式碼
class BootStrap {

    def shiroSecurityService

    def init = { servletContext ->
        //
Create the admin role def adminRole = Role.findByName('ROLE_ADMIN') ?: new Role(name: 'ROLE_ADMIN').save(flush: true, failOnError: true) // Create the user role def userRole = Role.findByName('ROLE_USER') ?: new Role(name: 'ROLE_USER').save(flush: true
, failOnError: true) // Create an admin user def adminUser = User.findByUsername('admin') ?: new User(username: "admin", passwordHash: shiroSecurityService.encodePassword('password')) .save(flush: true, failOnError: true) // Add roles to the admin user
assert adminUser.addToRoles(adminRole) .addToRoles(userRole) .save(flush: true, failOnError: true) // Create an standard user def standardUser = User.findByUsername('joe') ?: new User(username: "joe", passwordHash: shiroSecurityService.encodePassword('password')) .save(flush: true, failOnError: true) // Add role to the standard user assert standardUser.addToRoles(userRole) .save(flush: true, failOnError: true) } def destroy = { } }
複製程式碼

五.增加一個Controller

複製程式碼
package com.security

class HomeController {

    def index() {
        render ("此頁面不需要登陸")
    }
    def secured() {
        render ("此頁面需要使用者或者管理員登陸")
    }
    def admin() {
        render ("此頁面需要管理員登陸")
    }
}
複製程式碼

六.修改com.security.SecurityFilters.groovy

複製程式碼
package com.security

/**
 * Generated by the Shiro plugin. This filters class protects all URLs
 * via access control by convention.
 */
class SecurityFilters {
    def filters = {
        //1.role_admin
        home(controller: "home",action: "admin"){
            before = {
                accessControl{
                    role("ROLE_ADMIN");
                }
            }
        }
        //2.role_user
        home_securied(controller: "home",action: "secured"){
            before = {
                accessControl{
                    role("ROLE_USER");
                }
            }
        }
    }
}
複製程式碼

這裡使用的是shiroPlugin提供的accessControl,role方法會劃橫線,這裡是不影響程式執行的,

使用 role( …… ),驗證訪問物件是否具有相應的角色;

使用 permission( …… ),驗證訪問物件是否具有相應的 Permission。

這裡沒有使用shiro的Tag但是也做一點稱述

下是經常使用到的 Tag:

  • hasRole,判斷當前使用者是否屬於給定的角色,引數:name
  • hasPermission, 判斷當前使用者是否具有指定的許可權,引數:type,action 或者 permission
  • hasAnyRole,判斷當前使用者是否屬於給定的某個角色,引數:in

使用方式

複製程式碼
<shiro:hasPermission permission="home:index,admin"> 
   <span class="button"> 
 <g:actionSubmit class="edit" value="Edit" /> 
 </span> 
   <span class="button"> 
 <g:actionSubmit class="delete" 
 onclick="return confirm('Are you sure?');" 
 value="Delete" /> 
 </span> 
 </shiro:hasPermission>