本文共 2426 字,大约阅读时间需要 8 分钟。
在Grails应用中,保护URL访问可以通过多种方式实现,每种方式都有其特点和适用场景。以下是几种常见的配置方式,以及如何将访问者的URL与安全控制映射起来。
对于大多数应用,公共访问权限是默认的,只有部分页面需要不同的认证权限。在这种情况下,可以通过悲观锁定模式来拒绝所有未明确配置的URL访问。这种模式的核心思想是:如果一个URL没有被明确配置规则,它将被拒绝访问。
要启用悲观锁定模式,只需在grails-app/conf/Config.groovy文件中添加以下配置:
grails.plugins.springsecurity.rejectIfNoRule = true
这样,所有未设定规则的URL都会被拒绝访问。
无论采用哪种方式,你都需要配置一个映射,控制哪些URL可以被哪些角色访问。例如,/admin/user/**可能需要ROLE_ADMIN权限。以下是一些常用的标志:
IS_AUTHENTICATED_ANONYMOUSLY:表示任何用户(包括匿名用户)都可以访问。IS_AUTHENTICATED_REMEMBERED:表示用户已登录并选择了“记住我”功能。IS_AUTHENTICATED_FULLY:表示用户已完成完整的登录验证。通过这些标志,你可以灵活地控制URL的访问权限。例如:
/grails/plugins/springsecurity/interceptUrlMap = [ '/admin/user/**': ['ROLE_ADMIN'], '/finance/**': ['ROLE_FINANCE', 'IS_AUTHENTICATED_FULLY'], '/js/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], '/css/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], '/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], '/*': ['IS_AUTHENTICATED_ANONYMOUSLY'], '/login/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], '/logout/**': ['IS_AUTHENTICATED_ANONYMOUSLY']]
@Secured注解来定义规则。这种方式适合需要频繁修改规则的场景,但需要重新启动应用才能生效。在控制器中使用注解来定义安全规则。例如:
@Secured(['ROLE_ADMIN'])class SecureController { def index() { ... }} 类级别和动作级别的注解都可以使用,动作级别的注解优先于类级别的注解。
在Config.groovy中定义静态映射规则:
grails.plugins.springsecurity.controllerAnnotations.staticRules = [ '/js/admin/**': ['ROLE_ADMIN'], '/someplugin/**': ['ROLE_ADMIN']]
这种方式适合不需要修改插件代码的场景。
Spring Security支持使用表达式来定义更复杂的规则。例如:
@Secured(["hasRole('ROLE_ADMIN')"])def someAction() { ... } 这种方式允许你在规则中使用更灵活的条件。
Requestmap规则项会被缓存,为了确保配置的灵活性,需要定期刷新缓存。例如:
def save = { def requestmapInstance = new Requestmap(params) if (!requestmapInstance.save(flush: true)) { render view: 'create', model: [requestmapInstance: requestmapInstance] return } springSecurityService.clearCachedRequestmaps() flash.message = "${message(code: 'default.created.message', args: [message(code: 'requestmap.label', default: 'Requestmap'), requestmapInstance.id])}" redirect action: show, id: requestmapInstance.id} 通过结合表达式,你可以创建更精细的访问规则。例如:
new Requestmap(url: '/secure/someAction', configAttribute: "hasRole('ROLE_ADMIN')").save() 这种方式允许你在规则中使用复杂的逻辑条件。
通过以上方法,你可以根据实际需求选择最适合的配置方式,将访问者的URL与安全控制映射起来。
转载地址:http://dpefk.baihongyu.com/