Tak satu pun dari teknik yang disebutkan akan berhasil lagi. Tampaknya Spring telah berusaha keras untuk mencegah pengguna menimpa SecurityExpressionRoot.
EDIT 11/19/14 Setup Spring untuk menggunakan anotasi keamanan:
<beans ... xmlns:sec="http://www.springframework.org/schema/security" ... >
...
<sec:global-method-security pre-post-annotations="enabled" />
Buat kacang seperti ini:
@Component("mySecurityService")
public class MySecurityService {
public boolean hasPermission(String key) {
return true;
}
}
Kemudian lakukan sesuatu seperti ini di jsp Anda:
<sec:authorize access="@mySecurityService.hasPermission('special')">
<input type="button" value="Special Button" />
</sec:authorize>
Atau beri anotasi pada metode:
@PreAuthorize("@mySecurityService.hasPermission('special')")
public void doSpecialStuff() { ... }
Selain itu, Anda dapat menggunakan Spring Expression Language di @PreAuthorize
anotasi Anda untuk mengakses autentikasi saat ini serta argumen metode.
Sebagai contoh:
@Component("mySecurityService")
public class MySecurityService {
public boolean hasPermission(Authentication authentication, String foo) { ... }
}
Kemudian perbarui @PreAuthorize
agar sesuai dengan tanda tangan metode baru:
@PreAuthorize("@mySecurityService.hasPermission(authentication, #foo)")
public void doSpecialStuff(String foo) { ... }