博客
关于我
Spring Security Core Plugin - 5. 配置到安全URL的请求映射
阅读量:799 次
发布时间:2023-03-31

本文共 2426 字,大约阅读时间需要 8 分钟。

保护URL访问的多种方式

在Grails应用中,保护URL访问可以通过多种方式实现,每种方式都有其特点和适用场景。以下是几种常见的配置方式,以及如何将访问者的URL与安全控制映射起来。

1. 悲观锁定模式

对于大多数应用,公共访问权限是默认的,只有部分页面需要不同的认证权限。在这种情况下,可以通过悲观锁定模式来拒绝所有未明确配置的URL访问。这种模式的核心思想是:如果一个URL没有被明确配置规则,它将被拒绝访问。

要启用悲观锁定模式,只需在grails-app/conf/Config.groovy文件中添加以下配置:

grails.plugins.springsecurity.rejectIfNoRule = true

这样,所有未设定规则的URL都会被拒绝访问。

2. 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']
]

3. 配置方式的比较

  • 注解方式:通过在控制器中使用@Secured注解来定义规则。这种方式适合需要频繁修改规则的场景,但需要重新启动应用才能生效。
  • Config.groovy文件:在配置文件中定义URL规则,适合需要静态规则的场景,修改后需要重新启动应用。
  • Requestmap:将规则存储在数据库中,支持动态修改和删除,缓存机制会影响性能。

4. 定义安全控制注解

在控制器中使用注解来定义安全规则。例如:

@Secured(['ROLE_ADMIN'])
class SecureController {
def index() { ... }
}

类级别和动作级别的注解都可以使用,动作级别的注解优先于类级别的注解。

5. 静态映射规则

Config.groovy中定义静态映射规则:

grails.plugins.springsecurity.controllerAnnotations.staticRules = [
'/js/admin/**': ['ROLE_ADMIN'],
'/someplugin/**': ['ROLE_ADMIN']
]

这种方式适合不需要修改插件代码的场景。

6. 使用表达式定义规则

Spring Security支持使用表达式来定义更复杂的规则。例如:

@Secured(["hasRole('ROLE_ADMIN')"])
def someAction() { ... }

这种方式允许你在规则中使用更灵活的条件。

7. Requestmap的缓存

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
}

8. 使用表达式创建细粒度规则

通过结合表达式,你可以创建更精细的访问规则。例如:

new Requestmap(url: '/secure/someAction', configAttribute: "hasRole('ROLE_ADMIN')").save()

这种方式允许你在规则中使用复杂的逻辑条件。

通过以上方法,你可以根据实际需求选择最适合的配置方式,将访问者的URL与安全控制映射起来。

转载地址:http://dpefk.baihongyu.com/

你可能感兴趣的文章
SpringBoot中集成LiteFlow(轻量、快速、稳定可编排的组件式规则引擎)实现复杂业务解耦、动态编排、高可扩展
查看>>
P5-js python中的map()函数
查看>>
SpringBoot中集成influxdb-java实现连接并操作Windows上安装配置的influxDB(时序数据库)
查看>>
P8738 [蓝桥杯 2020 国 C] 天干地支
查看>>
PA
查看>>
Package Header Cursor
查看>>
package,source folder,folder相互转换
查看>>
SpringBoot中集成Flyway实现数据库sql版本管理入门以及遇到的那些坑
查看>>
package.json文件常用指令说明
查看>>
SpringBoot中集成eclipse.paho.client.mqttv3实现mqtt客户端并支持断线重连、线程池高并发改造、存储入库mqsql和redis示例业务流程,附资源下载
查看>>
Padding
查看>>
paddlehub安装及对口罩检测
查看>>
SpringBoot中集成Actuator实现监控系统运行状态
查看>>
PaddleSlim 模型量化 源代码解读
查看>>
paddle的两阶段基础算法基础
查看>>