Play框架中如何为指定的SIRD路由禁用CSRF校验?
解决方案
+nocsrf 是Play内置路由文件的静态编译标记,仅对conf/routes里直接定义的静态路由生效,通过->挂载的SIRD动态路由无法识别该标记,可根据场景选择以下两种实现方案:
方案1:整个SIRD路由前缀统一跳过CSRF校验
如果挂载的SIRD路由下所有接口都不需要CSRF校验(比如纯对外API服务),可以直接修改全局过滤器的CSRF触发逻辑,匹配对应路径前缀直接跳过:
import play.api.mvc._ import play.api.filters._ import play.filters.csrf.CSRFFilter import javax.inject._ @Singleton class Filters @Inject()(csrfFilter: CSRFFilter) extends DefaultHttpFilters { override def filters: Seq[EssentialFilter] = Seq( csrfFilter.withApplyOnRequest { req => // 路径以/api开头的请求全部跳过CSRF校验 !req.path.startsWith("/api") } ) }
方案2:SIRD路由内指定单个接口跳过
如果仅需要给部分接口跳过校验,可以在SIRD路由匹配时,用Play提供的CSRF.Ignore动作组合器包裹对应Action即可:
- 首先在ApiRouter中导入CSRF工具类:
import play.filters.csrf.CSRF
- 路由匹配时给需要跳过的接口加包裹逻辑:
override def routes: Routes = { // 该接口跳过CSRF校验 case POST(p"/new") => CSRF.Ignore(controller.newThing) // 其他接口仍走正常CSRF校验 case GET(p"/") => controller.index }
也可以直接在Controller的Action定义处包裹,效果完全一致。
内容的提问来源于stack exchange,提问作者Suga Raj
相关产品推荐
相关产品推荐

