0

ブラウザベースのゲームをやっています。スプリングコントローラーがたくさんあるとしましょう〜10個のコントローラー。そして、それぞれに 10 個の URL マッピングがあります。それは 100 以上のマッピング方法のようなものです。

特定のルールが満たされた場合にのみ、各マッピングは正しいコンテンツをロードまたは表示します。ルールは、DB クエリを実行してチェックされます。:

私はレベル 12 のユーザーであり、ユーザーがレベル 10+、20+、30+、40+、50+ などの場合にのみ、各コントローラーでコンテンツを表示できるようにしています。

すべてのコントローラーのすべてのマッピング メソッドでクエリを実行することでそれを行うことができましたが、ボイラーメッキが多すぎます。

制限マッピングをどこかにまとめて保持し、すべての URL マッピング メソッドの下に配置する必要がないなど、何とか集中化する方法はありますか?

設計上はおそらくそのようなことはないとしても、同じ問題を抱えていて、巧妙な解決策を思いついたことがあるのではないでしょうか?

4

1 に答える 1

1

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 @PostAuthorizeand @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>
于 2012-12-18T13:35:26.310 に答える