有关更多背景信息,请参阅http://grails.markmail.org/message/62w2xpbgneapmhpd
我试图在我的 BootStrap.groovy 中模拟 Shiro SecurityUtils.getSubject() 方法。我决定采用这种方法是因为最新 Shiro 版本中的主题构建器在当前版本的 Nimble 插件(我正在使用)中不可用。我决定尝试使用 SecurityUtils.metaClass,但我觉得我错过了关于元类如何工作的一些非常基本的东西。作为参考,这是我的 Trackable 课程:
abstract class Trackable {
User createdBy
Date dateCreated
User lastUpdatedBy
Date lastUpdated
static constraints = {
lastUpdated(nullable:true)
lastUpdatedBy(nullable:true)
createdBy(nullable:true)
}
def beforeInsert = {
def subject
try {
subject = SecurityUtils.subject
} catch (Exception e) {
log.error "Error obtaining the subject. Message is [${e.message}]"
}
createdBy = (subject ? User.get( subject.principal ) :
User.findByUsername("admin"))
}
def beforeUpdate = {
def subject
try {
subject = SecurityUtils.subject
} catch (Exception e) {
log.error "Error obtaining the subject. Message is [${e.message}]"
}
lastUpdatedBy = (subject ? User.get( subject.principal ) :
User.findByUsername("admin"))
}
}
在我的 BootStrap.groovy 中,我有这个:
def suMetaClass = new ExpandoMetaClass(SecurityUtils)
suMetaClass.'static'.getSubject = {[getPrincipal:{2}, toString:{"Canned Subject"}] as Subject}
suMetaClass.initialize()
SecurityUtils.metaClass = suMetaClass
那行得通……有点。如果我从 BootStrap.groovy 打印出主题,我会得到“罐头主题”。如果我尝试创建和保存 Trackable 子类的实例,我会得到:
No SecurityManager accessible to this method, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. See the org.apache.shiro.SecurityUtils.getSubject() method JavaDoc for an explanation of expected environment configuration.
我是否遗漏了有关元类如何工作的一些重要内容?