spring-security
カスタムで使用することをお勧めします。これにより、PermissionEvaluator
基本的に Web ページとコントローラーの両方で同じ実装を
使用できるよう
<security:authorize access="hasPermission(#shop,'see')"></security:authorize>
になります。
@PreAuthorize("hasPermission(#shop,'see')")
このような:
@PreAuthorize("hasPermission(#shop,'see')")
@RequestMapping("/someUrl")
public String processSomeUrl(@ModelAttribute("shop") Shop shop){
shop.getStuff();
}
or also @PostAuthorize
and @PostFilter("hasPermission(filterObject,'see')")
(リストをフィルタリングするため)
これらの機能はすべて、アクセスを制限するか、独自の権限評価者に従って結果リストをフィルタリングします。それらはすべて同じ実装を指し、次のようになります。
@Component
public class MyPermissionEvaluator implements PermissionEvaluator {
private final Log logger = LogFactory.getLog(getClass());
@Override
public boolean hasPermission(Authentication auth, Object arg1, Object arg2) {
logger.info("hasPermission "+auth+" - "+arg1+" - "+arg2+" ");
if(arg2 instanceof String && arg1 instanceof Shop){
Shop shop = (Shop)arg1;
if(((String) arg2).equals("see")){
//here you can have your own function
boolean result = hasPermissionSeeShop(auth, project);
return result;
}
}
return false;
}
@Override
public boolean hasPermission(Authentication arg0, Serializable arg1,
String arg2, Object arg3) {
logger.info("hasPermission "+arg0+" - "+arg1+" - "+arg2+" - "+arg3+" ");
return false;
}
}
また、これらのメソッドが false を返すと、AccessDeniedException が自動的にスローされ、http 要素で独自の accessDenied ページにリダイレクトするように簡単に構成できます。
<http auto-config="true">
<intercept-url pattern="/admin*" access="ROLE_ADMIN" />
<access-denied-handler error-page="accessDeniedPage"/>
</http>