көктем қауіпсіздігі: қайсы ресурсқа қол жеткізілгеніне байланысты екі қолжетімділікке тыйым салынған беттер/өңдегіштер

Мысалы, менде бар:



Және, сәйкесінше, егер пайдаланушы бет/aaa іздейтін болса және бір уақытта ROLE_AAA рөлі болмаса - мен оны page/access-denied-aaa /

And, if he was trying to get /bbb and had no ROLE_BBB -> to page /access-denied-bbb/.

Қазіргі уақытта бір ғана AccessDeniedHandler-ды сипаттай аламын, бір жалпы қолжетімділік бар беті бар ...

Әдетте бұл қалай жүзеге асырылады? көктем қауіпсіздігін қолданады

2

1 жауаптар

Сіз әрқашан өзіңіздің AccessDeniedHandler бағдарламасын қолдана аласыз. Әдепкі AccessDeniedHandlerImpl (пакет және импорт жоқ):

public class PageByResourceAccessDeniedHandler extends AccessDeniedHandlerImpl {

    //~ Instance fields ===================================

    /**A Map of Path by Error Page*/
    private Map errorPagesByPaths;
    /**The default error page if any of {@link #errorPagesByRole} matches */
    private String defaultErrorPage;

    //~ Main Methods ======================================

    @Override
    public void handle(HttpServletRequest request,
            HttpServletResponse response,
            AccessDeniedException accessDeniedException) throws IOException,
            ServletException {
        String errorPage = determineErrorPage(request);
        setErrorPage(errorPage);
        super.handle(request, response, accessDeniedException);
    }

    /**
     * Searches into the property {@link #errorPagesByRole} for a matching error page
     * for the current denied request path.
     * @param request current request
     * @return a matching error page found in {@link #errorPagesByRole} or {@link #defaultErrorPage}
     * if none was found.
     */
    private String determineErrorPage(HttpServletRequest request) {
        AntPathMatcher apm = new AntPathMatcher();

        for (String key : errorPagesByPaths.keySet()) {
            if(apm.match(key, request.getServletPath())) {
                return errorPagesByPaths.get(key);
            }
        }
        return defaultErrorPage;
    }

    //~ Getters/Setters/Utilities =========================

    public void setErrorPagesByPaths(Map errorPagesByPaths) {
        for (String key : errorPagesByPaths.keySet()) {
            validateErrorPage(errorPagesByPaths.get(key));
        }
        this.errorPagesByPaths = errorPagesByPaths;
    }

    public void setDefaultErrorPage(String errorPage) {
        validateErrorPage(errorPage);
        this.defaultErrorPage = errorPage;
    }

    /**
     * Simple validator based on {@link AccessDeniedHandlerImpl#setErrorPage(String)}
     * code. Just verifies if the page doesn't starts with /.
     * 
     * @throws IllegalArgumentException if the errorPage doesn't starts with /.
     */
    private void validateErrorPage(String errorPage) {
        if ((errorPage != null) && !errorPage.startsWith("/")) {
            throw new IllegalArgumentException("errorPage " + errorPage + " must begin with '/'");
        }
    }
}

Бағдарламаны мәтінмәндік конфигурация файлында қалай баптай аласыз:


  
  
          

http бөлімінде оны пайдалану үшін Spring Security бағдарламасын айтуды ұмытпаңыз:

...

    
    ...

Ең алдымен, есіңізде болсын: бұл тек идея. Ол жұмыс істейді, бірақ оны жақсартуға болады.

Basically it has a Map in which the keys are the protected resources, and the values are their error pages. And it has a default one.
It uses an AntPathMatcher to determine the error page for the current request so you can normally use ant paths. After it decides what is the error page, the class just call the handle method of it's superclass (AccessDeniedHandlerImpl).

Оны конфигурациялаудың жақсы тәсілі келесідей:


       

Бірақ қателіктер тудырған пайдаланушы қандай рөл атқармағанын білудің амалын таба алмадым. Егер сіз RoleVoter коды, бұл ақпарат жоғалғанын көре аласыз.

6
қосылды