有些目录我们希望不限制访问的权限,比如 css、images、js等。
<s:http pattern="/css/**" security="none"/>
<s:http pattern="/images/**" security="none"/>
<s:http pattern="/js/**" security="none"/>
上面的配置和以前的 <s:intercept-url pattern='/css/**' filters='none'/> 作用是一样的,但从 spring security 3 开始不再支持上面的写法——这是很多开源项目让人无语的地方——不在意兼容性。
其中 ** 代表可以跨越目录。
下面这一部分配置是对 http 的过滤:
<s:http
auto-config="true"
use-expressions="true"
entry-point-ref="accessDeniedHandler" >
<s:intercept-url pattern="/service/**" access="hasAnyRole('USER')" />
<s:intercept-url pattern="/home/**" access="hasAnyRole('USER')" />
<s:access-denied-handler ref="accessDeniedHandler"/>
<s:form-login
login-page="/login"
default-target-url="/home"
authentication-failure-url="/login_fail" />
<s:logout logout-success-url="/login" />
<s:custom-filter ref="afterLoginFilter" after="FORM_LOGIN_FILTER" />
</s:http>
上面 <s:intercept-url …… /> 匹配过滤的路径。hasAnyRole 用于匹配一个使用GrantedAuthority 的角色列表(这里说的角色是 spring security 里的概念,不是我们定义的业务上的角色)。用户匹配其中的任何一个均可放行。
entry-point-ref 为用户第一次访问受保护的url时的处理程序。这个程序需要实现 AuthenticationEntryPoint 接口。我们可以在这里让没登录的用户跳转到登录页面去。
access-denied-handler是在拒绝用户访问(用户没有访问权限)的时候处理的程序。这个程序需要实现 AccessDeniedHandler 接口。我们可以在这里让用户跳转到 403 页面去。
form-login 这部分是登录控制
<s:custom-filter ref="afterLoginFilter" …… /> 这部分定义了一个 filter ,在 FORM_LOGIN_FILTER 之后。加这个的原因是这样的。我希望在登录后能将一些内容放在 session 中,但使用 LDAP 的 authentication provider 时无法在我自己实现的 authoritiesPopulator(这个后面会说到)中得到 session 。我觉得一种方法可能是用自己定义的 UserDetails 代替 spring security 中的实现,但由于时间关系没有太研究,如果哪位看官有经验可以一起讨论。另一种方法就是我现在这样,在登录后拦截一下,然后从 SecurityContextHolder.getContext().getAuthentication().getName() 中把用户输入的登录名拿出来,再到捞出我想要的信息,放在了 session 里。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33983-2.html
一看里面都是