spring security 调用MyAccessDecisionManager 问题

林乐超 2016-02-03 02:10:35
使用 spring mvc mybatis spring security 配置 spring security的时候调用不到
自定义的MyAccessDecisionManager debug,控制台输出都无果 研究好几天没有进展 求大神指导

贴上 security xml 代码

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">

<!-- 流程
1)容器启动(MySecurityMetadataSource:loadResourceDefine加载系统资源与权限列表)
2)用户发出请求
3)过滤器拦截(MySecurityFilter:doFilter)
4)取得请求资源所需权限(MySecurityMetadataSource:getAttributes)
5)匹配用户拥有权限和请求权限(MyAccessDecisionManager:decide),如果用户没有相应的权限,
执行第6步,否则执行第7步。
6)登录
7)验证并授权(MyUserDetailServiceImpl:loadUserByUsername)
-->

<!--auto-config = true 则使用from-login 如果不使用该属性 则默认为http-basic(没有session)-->
<!--access-denied-page:访问拒绝时转向的页面 -->
<http use-expressions="true" access-denied-page="/timeOut/timeOut.jsp">
<!-- 该路径下的资源不用过滤 -->
<intercept-url pattern="/js/**" filters="none" />
<intercept-url pattern="/css/**" filters="none" />
<intercept-url pattern="/images/**" filters="none" />
<intercept-url pattern="/video/**" filters="none" />
<intercept-url pattern="/login/login.jsp" filters="none" />
<intercept-url pattern="/timeOut/timeOut.jsp" filters="none" />

<!--login-page:指定登录页面 -->
<!-- authentication-failure-url:指定了身份验证失败时跳转到的页面。-->
<!-- default-target-url:指定了成功进行身份验证和授权后默认呈现给用户的页面。-->
<form-login login-page="/login/login.jsp"
authentication-failure-url="/timeOut/timeOut.jsp" default-target-url="/techPic/techPic.jsp" />
<logout logout-success-url="/login/login.jsp" />
<!-- 增加一个filter,这点与Acegi是不一样的,不能修改默认的filter了,这个filter位于FILTER_SECURITY_INTERCEPTOR之前 -->
<custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="myFilter" />
</http>

<authentication-manager alias="MyAuthenticationManager">
<authentication-provider user-service-ref="myUserDetailsService" />
</authentication-manager>


<!-- 一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性-->
<beans:bean id="myFilter" class="com.llb.ewater.interceptor.securityInterceptor.MyFilterSecurityInterceptor">
<!--在这个类中,你就可以从数据库中读入用户的密码,角色信息,是否锁定,账号是否过期等 -->
<beans:property name="authenticationManager" ref="MyAuthenticationManager" />
<!--访问决策器,决定某个用户具有的角色,是否有足够的权限去访问某个资源 -->
<beans:property name="accessDecisionManager" ref="myAccessDecisionManagerBean" />
<!--资源源数据定义,将所有的资源和权限对应关系建立起来,即定义某一资源可以被哪些角色访问 -->
<beans:property name="securityMetadataSource" ref="securityMetadataSource" />
</beans:bean>

<!--在这个类中,你就可以从数据库中读入用户的密码,角色信息,是否锁定,账号是否过期等 -->
<beans:bean id="myUserDetailsService" class="com.llb.ewater.security.MyUserDetailsService" />

<!-- 访问决策器,决定某个用户具有的角色,是否有足够的权限去访问某个资源 -->
<beans:bean id="myAccessDecisionManagerBean" class="com.llb.ewater.security.MyAccessDecisionManager" />

<!-- 资源源数据定义,即定义某一资源可以被哪些角色访问 -->
<beans:bean id="securityMetadataSource" class="com.llb.ewater.security.MyInvocationSecurityMetadataSource" />

</beans:beans>

贴上调用自定义myUserDetailsService 代码

package com.llb.ewater.security;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;


public class MyUserDetailsService implements UserDetailsService {

// 登陆验证时,通过username获取用户的所有权限信息,
// 并返回User放到spring的全局缓存SecurityContextHolder中,以供授权器使用

public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {

System.err.println("username===="+username);
Collection<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
GrantedAuthorityImpl auth2 = new GrantedAuthorityImpl("ROLE_ADMIN");
GrantedAuthorityImpl auth1 = new GrantedAuthorityImpl("ROLE_USER");

if (username.equals("ewater")) {
auths = new ArrayList<GrantedAuthority>();
auths.add(auth1);
auths.add(auth2);
}

User user = new User(username, "123456", true, true, true, true, auths);
return user;
}
}
...全文
737 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
挥洒寂寞 2016-08-26
  • 打赏
  • 举报
回复
遇到同样的问题楼主解决了吗
Alive丶 2016-06-15
  • 打赏
  • 举报
回复
解决木有,我也遇到了,求帮助
林乐超 2016-02-03
  • 打赏
  • 举报
回复
大神都回家过年了吗- -!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧