Я пробовал безопасность «Уровня метода» в этом приложении, над которым я работал. Идея состоит в том, чтобы защитить метод, который вызывается с уровня представления, используя DWR. Теперь я попытался добавить следующие аннотации к своему методу:
@PreAuthorize("isAuthenticated() and hasRole('ROLE_CUSTOMER')")
И соответствующая запись в моем контексте безопасности:
<global-method-security pre-post-annotations="enabled" />
Аналогичным образом я пробовал аннотацию @Secured:
@Secured({"ROLE_CUSTOMER" })
И соответствующая запись в моем контексте безопасности:
<global-method-security secured-annotations="enabled" />
В идеале я ожидаю, что если пользователь не аутентифицирован, он должен быть перенаправлен на страницу «Войти», а «РОЛИ» не должны проверяться. В этом случае даже для пользователя, не прошедшего проверку подлинности, вызов этого метода приводит к «AccessDeniedException». Мне нужно, чтобы перенаправить пользователя на страницу входа в такой сценарий.
Чтобы продвинуться вперед, я даже попытался обработать исключение, связанное с отказом в доступе, создав собственный обработчик отказа в доступе. К сожалению, обработчик так и не был вызван, но было выдано исключение.
Вот конфигурация:
<access-denied-handler ref="customAccessDeniedHandler"/>
Для этого есть соответствующий bean-компонент обработчика, определенный в том же файле.
Все равно не повезло. Обработчик отказа в доступе никогда не вызывается.
Чтобы обобщить требование, мне нужно защитить метод. Если этот метод вызывается, а пользователь не аутентифицирован, пользователь должен быть перенаправлен на страницу «Войти» (которая на данный момент выдает исключение Accessdenied).
Ценю вашу помощь, люди..
EDIT 1: Вот фрагмент из контекста безопасности:
<http>
<intercept-url pattern="/*sign-in.do*" requires-channel="$secure.channel}" />
.....
.....
.....
<intercept-url pattern="/j_acegi_security_check.do" requires-channel="${secure.channel}" />
<intercept-url pattern="/*.do" requires-channel="http" />
<intercept-url pattern="/*.do\?*" requires-channel="http" />
<form-login login-page="/sign-in.do" authentication-failure-url="/sign-in.do?login_failed=1"
authentication-success-handler-ref="authenticationSuccessHandler" login-processing-url="/j_acegi_security_check.do"/>
<logout logout-url="/sign-out.do" logout-success-url="/index.do" />
<session-management session-authentication-strategy-ref="sessionAuthenticationStrategy" />
<access-denied-handler ref="customAccessDeniedHandler"/>
</http>
<beans:bean id="customAccessDeniedHandler" class="com.mypackage.interceptor.AccessDeniedHandlerApp"/>