3 Stimmen

Verwendung von @RolesAllowed auf Controller und Erhalt von "object is not an instance of declaring class"

Ich versuche, Method Security zu verwenden, so dass ich auf Dispatcher-servlet.xml (security.xml ist auf einem anderen Kontext):

<security:global-method-security secured-annotations="enabled" jsr250-annotations="enabled" />

Und setzen Sie @RolesAllowed auf Controller:

@SessionAttributes({"sessionCompanyDetails"})
@Controller
@RequestMapping("/company")
@RolesAllowed("ROLE_ADMIN")
public class CompanyController extends BaseController {
  ...

Ich erkannte, dass, wenn ich diese Annotationen die Spring machen einen Proxy zu Controller und deshalb bekomme ich den Fehler:

java.lang.IllegalArgumentException:object is not an instance of declaring class

0 Stimmen

Könnten Sie bitte den vollständigen Stack-Trace posten?

2voto

Bruno Punkte 417

Das Problem tritt auf, weil der Controller keine Schnittstelle hat, so dass Spring einen Proxy erstellt, aber nicht auf die Controller-Klasse casten kann.

Mögliche Lösungen sind:

  1. Abfangjäger: mit MethodSecurityInterceptor und AccessDecisionManager
  2. Verwendung von <global-method-security proxy-target-class="true"/> die den CGLib-Proxy aktivieren (die Proxy-Klasse ist eine Unterklasse), so dass Spring sie casten kann.
  3. Erstellen Sie eine Schnittstelle zum Controller.
  4. Verwendung von ApectJ.

Ich habe alle Lösungen außer ApectJ getestet. Ich verwende die CGLib-Lösung für ein Projekt und für ein anderes verwende ich Interceptor, beide Lösungen funktionieren gut.

0voto

knalli Punkte 1933

Bitte geben Sie uns mehr Informationen.

  1. Die Ausnahme wurde mit einer bestimmten Codezeilennummer ausgelöst (Ursache)?
  2. Möchten Sie JSR250-Annotationen (@RolesAllowed) oder die Spring-Way-Annotationen (@Secured) verwenden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X