Web開発機能権限制御

6165 ワード

ウェブサイトの開発の過程で、いくつかの機能を特定のユーザーにのみ提供して使用させることがよくあります.例えば、いくつかの高度な機能は会員ユーザーにのみ提供され、一般的な一般ユーザーは簡単な機能にしかアクセスできません.
具体的な実現方式は以下の通りである.
(1)フロントエンド制御:
フロントエンドの制御は比較的簡単で、バックグラウンドからユーザーの権限を取得した後、sessionまたはcookieに存在し、ページのロード時にsessionまたはcookieに保存されている権限でその機能を表示または無効にすることを選択できます.
(2)バックグラウンドコントロール:
フロントエンドの制御だけでは権限制御の問題を完璧に解決できない.フロントエンドのページのロードプロセスはブラウザで完了し、ユーザーは自分でページを改ざんすることができるからだ.あるいは、ユーザは、URI要求によって不正な権限機能を直接取得することができる.そのため、バックグラウンドで権限制御を実現する必要があります.
バックグラウンドの制御方法も多く,filter,springのAOPなどである.ここではspringMVCのinterceptorを選択して制御します.
まず、以下に示すように、appContext-mvc.xmlプロファイルでブロッカーを構成します.
<mvc:interceptors>
    
    <mvc:interceptor>  
        <mvc:mapping path="/fund/mem/**" />
        <bean class="org.fund.user.interceptor.AuthInterceptor" />  
    mvc:interceptor>
mvc:interceptors>  

ここでpathは制御が必要なインタフェースパスを表し、正規表現を使用してマッチングすることができる.
次に、自分でブロッキングクラスを定義し、HandlerInterceptorインタフェースを継承し、preHandleメソッドで権限判断を行う必要があります.以下に示します.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    User user = UserHolder.getUser();
    if (user.getAuth() == GameIdeaType.VIP_USER.getId()) {
        return true;
    } else {
        return false;
    }
}

このとき,ユーザがインタフェースにアクセスすると,まずこのブロックのpreHandleメソッドにアクセスして処理する.権限が通過するとtrueが返されます.そうでなければfalseに戻り、今回のアクセスは終了します.
これにより,権限の制御は実現したが,ユーザが不正な権限インタフェースにアクセスしたときにヒントを与えることはできない.この問題を解決するには、グローバル例外管理を追加する必要があります.
(3)グローバル異常管理:
ブロッカーで権限チェックに失敗した場合、権限チェックに失敗した例外を投げ出し、グローバル例外管理クラスを介してフロントエンドの特定のフォーマットをキャプチャして返すことを考えます.具体的には以下の通りです.
まず、プロファイルにグローバル例外管理クラスを追加します.次のようにします.

<bean id="handlerExceptionResolver" class="org.fund.common.ExceptionHandler">
    <property name="order" value="0">property>
bean>

次に、例外管理クラスを定義し、SimpleMappingExceptionResolverインタフェースを実装します.
/**
 *        
 * 
 * @author 
 */
public class ExceptionHandler extends SimpleMappingExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
        logger.info("System Error Occurred. " + e.getMessage(), e);

        ModelAndView model = new ModelAndView(new MappingJacksonJsonView());
        List errors = new ArrayList();

        if (e instanceof NoPermissionException) {
            errors.add("  ,             !");
        } else {
            errors.add("    ");
        }

        return paramError(model, errors);
    }

    private ModelAndView paramError(ModelAndView mv, List errors) {
        mv.addObject("success", false);
        mv.addObject("data", null);
        mv.addObject("errors", errors);
        return mv;
    }

}

最後に、ブロッキングの実装を変更します.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    User user = UserHolder.getUser();
    if (user.getAuth() == GameIdeaType.VIP_USER.getId()) {
        return true;
    } else {
        throw new NoPermissionException();
    }
}