Web アプリの任意のコントローラーから利用可能なすべてのアクションを読み取る必要があります。この理由は、ユーザーに許可されたアクションのリストを提供する必要がある認証システムです。
例: ユーザー xyz は、アクション show、list、search を実行する権限を持っています。ユーザー管理者には、編集、削除などのアクションを実行する権限があります。
コントローラーからすべてのアクションを読み取る必要があります。誰にもアイデアがありますか?
Web アプリの任意のコントローラーから利用可能なすべてのアクションを読み取る必要があります。この理由は、ユーザーに許可されたアクションのリストを提供する必要がある認証システムです。
例: ユーザー xyz は、アクション show、list、search を実行する権限を持っています。ユーザー管理者には、編集、削除などのアクションを実行する権限があります。
コントローラーからすべてのアクションを読み取る必要があります。誰にもアイデアがありますか?
これにより、コントローラー情報を含むマップのリスト (「データ」変数) が作成されます。List の各要素は、コントローラの URL 名に対応する「controller」キー (BookController ->「book」など)、クラス名に対応する controllerName (「BookController」)、および「actions」キーを持つマップです。そのコントローラーのアクション名のリスト:
import org.springframework.beans.BeanWrapper
import org.springframework.beans.PropertyAccessorFactory
def data = []
for (controller in grailsApplication.controllerClasses) {
def controllerInfo = [:]
controllerInfo.controller = controller.logicalPropertyName
controllerInfo.controllerName = controller.fullName
List actions = []
BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(controller.newInstance())
for (pd in beanWrapper.propertyDescriptors) {
String closureClassName = controller.getPropertyOrStaticPropertyOrFieldValue(pd.name, Closure)?.class?.name
if (closureClassName) actions << pd.name
}
controllerInfo.actions = actions.sort()
data << controllerInfo
}
Grailsは、これを行う簡単な方法をサポートしていません。しかし、私は利用可能なgrailsメソッドからパズルを組み立てることができ、この解決策に到達しました。
def actions = new HashSet<String>()
def controllerClass = grailsApplication.getArtefactInfo(ControllerArtefactHandler.TYPE)
.getGrailsClassByLogicalPropertyName(controllerName)
for (String uri : controllerClass.uris ) {
actions.add(controllerClass.getMethodActionName(uri) )
}
変数grailsApplicationとcontrollerNameは、grailsによって挿入されます。コントローラ自体には必要なメソッドがないため、このコードは必要なもの(プロパティとメソッド)を持つcontrollerClass( GrailsControllerClassを参照)を取得します。uris
getMethodActionName
アクション名を含むすべてのメソッドのリストを出力するには:
grailsApplication.controllerClasses.each {
it.getURIs().each {uri ->
println "${it.logicalPropertyName}.${it.getMethodActionName(uri)}"
}
}
すべてのコントローラーとそれぞれの URI のリストを取得する必要がありました。これは、grails 3.1.6 アプリケーションで行ったことです。
grailsApplication.controllerClasses.each { controllerArtefact ->
def controllerClass = controllerArtefact.getClazz()
def actions = controllerArtefact.getActions()
actions?.each{action->
def controllerArtefactString = controllerArtefact.toString()
def controllerOnly = controllerArtefactString.split('Artefact > ')[1]
println "$controllerOnly >>>> $controllerOnly/${action.toString()}"
}
}