学习Spring-security (2)

Maven项目创建好之后,并加载好对应的Jar包依赖之后。

接着搭建Spring-Security环境

注意:使用Spring-Security 必须得加载Spring框架的依赖包 (Spring,Common等等Jar)

  1. 配置web.xml 加载Spring容器的监听器 ContextLoaderListener
  2. 加载Spring-Security的拦截器 filter.DelegatingFilterProxy
  3. 加载上述两个的配置文件 

   web.xml配置文件如下:

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                         "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <display-name>Archetype Created Web Application</display-name>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml,
        classpath:applicationContext-security.xml</param-value>
 </context-param>
 <!-- SpringSecurity 核心过滤器配置 -->
 <filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
</web-app>

      配置Spring-security.xml文件 如下:

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:sec="http://www.springframework.org/schema/security"  
    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-3.2.xsd">  
  
    <!-- 配置不过滤的资源(静态资源及登录相关) -->  
    <sec:http pattern="/**/*.css" security="none"></sec:http>  
    <sec:http pattern="/**/*.jpg" security="none"></sec:http>  
    <sec:http pattern="/**/*.jpeg" security="none"></sec:http>  
    <sec:http pattern="/**/*.gif" security="none"></sec:http>  
    <sec:http pattern="/**/*.png" security="none"></sec:http>  
    <sec:http pattern="/js/*.js" security="none"></sec:http>  
      
    <sec:http pattern="/login.jsp" security="none"></sec:http>  
    <sec:http pattern="/getCode" security="none" /><!-- 不过滤验证码 -->  
    <sec:http pattern="/test/**" security="none"></sec:http><!-- 不过滤测试内容 -->  
      
    <sec:http auto-config="true">  
        <!-- 配置资源链接过滤,表示意思为:访问/app.jsp 需要ROLE_SERVICE 权限 -->
        <sec:intercept-url pattern="/app.jsp" access="ROLE_SERVICE"/>  
         <!-- 配置资源链接过滤,表示意思为:访问所有资源   需要ROLE_ADMIN 权限 -->
        <sec:intercept-url pattern="/**" access="ROLE_ADMIN"/>  
        <!-- 注意,Spring-security采用从上到下过滤,你访问的链接 Spring从上面开始往下找。上面的优先级比下面的优先级高。-->
        
        <!-- 
        	自定义登陆页面,login-page 自定义登陆页面
        	authentication-failure-url 用户权限校验失败之后才会跳转到这个页面,如果数据库中没有这个用户则不会跳转到这个页面。
        	default-target-url 登陆成功后跳转的页面。
        	注:登陆页面用户名固定 name:j_username,密码 name:j_password,action:/j_spring_security_check
         -->
        <sec:form-login login-page="/login.jsp" authentication-failure-url="/loginfail.jsp" default-target-url="/index.jsp"/>
        
        <!-- 
        	登出, invalidate-session 是否删除session
			logout-url:登出处理链接
			logout-success-url:登出成功页面
			注:登出操作 只需要链接到 logout即可登出当前用户        	
        -->
        <sec:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp"/>      
    </sec:http>  

    <!-- 权限管理器,用来查询用户的所有权限使用。登陆用户之后,由这个拦截器来查询用户,分配对应的权限 ,然后分配给sec:http 来做对应的拦截-->
    <sec:authentication-manager>  
    	<!-- 手动定义一个用户以及对应的权限 -->
        <sec:authentication-provider>  
            <sec:user-service >  
                <sec:user name="admin" password="admin" authorities="ROLE_ADMIN"/>  
            </sec:user-service>  
        </sec:authentication-provider>
        <!-- 自己定义 一个类处理用户登陆的时候,用户名,密码,权限获取-->
        <sec:authentication-provider user-service-ref="Userservices"></sec:authentication-provider>
        <!-- 直接通过SQL来获取数据库中的用户名,密码,权限-->
        <sec:authentication-provider>
        	<sec:jdbc-user-service data-source-ref="Datasource" authorities-by-username-query="select b.username as username,a.ROLE_CODE as authority from ZX_ROLE a left join ZX_USER b on a.USER_ID=b.ID where b.username=?" 
				users-by-username-query="select username,password,enable as status from ZX_USER where username=?"/>
        </sec:authentication-provider>
    </sec:authentication-manager>  
</beans> 

配置applicationContext.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:sec="http://www.springframework.org/schema/security"  
    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-3.1.xsd">  
        
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        	<property name="dataSource" ref="Datasource"></property>
        	<property name="mappingLocations">
        		<list>
        			<value>classpath*:/hibernate/*.hbm.xml</value>
        		</list>
        	</property>
        </bean>
        <!-- 
        	这个类为用户登陆 处理类,需要实现UserDetailsService接口  
        	重写 loadUserByUsername 方法,并且注意  此方法的返回值为UserDetails类型
        	而UserDetails 是一个接口,所以应该返回他的实现类 org.springframework.security.core.userdetails.User
        	注意org.springframework.security.core.userdetails.User的参数 有七个
        	username,用户登陆名
        	password,密码
        	enabled,是否可用
        	accountNonExpired,set to true if the account has not expired
			credentialsNonExpired, set to true if the credentials have not expired
			accountNonLocked, set to true if the account is not locked
			authorities,是用户的权限集合 泛型为<?  extends GrantedAuthority> collection
			所以这个值需要我们定义一个泛型为GrantedAuthority(这是一个接口 ,他的实现类为GrantedAuthorityImpl)集合
			我们查询出对应的用户角色后 遍历 并且实例化GrantedAuthorityImpl 设置对应的角色代码 放入集合
			最后返回org.springframework.security.core.userdetails.User即可
        -->
        <bean id="Datasource" class="org.apache.commons.dbcp.BasicDataSource">
        	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        	<property name="url" value="*"></property>
        	<property name="username" value="**"></property>
        	<property name="password" value="***"></property>
        </bean>
    	<bean id="Userservices" class="services.userserviceDaoImp">
    		<property name="udi" ref="userdaoimp"></property>
    	</bean>
    	<bean id="userdaoimp" class="Dao.userDaoimp">
    		<property name="sessionFactory" ref="sessionFactory"></property>
    	</bean>
</beans>

用户登陆操作类 如下:

package services;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import hibernate.Role;
import hibernate.User;

import org.springframework.security.config.http.UserDetailsServiceFactoryBean;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import Dao.userDaoimp;


public class userserviceDaoImp implements UserDetailsService{
	private userDaoimp udi;
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException {
		System.out.println(username);
		System.out.println(udi.getSessionFactory());
		User u=udi.getUserByname(username);
		System.out.println(u.toString());
		List<Role> list=udi.getRoleByUser(u);
		List<GrantedAuthority> rolelist=new ArrayList<GrantedAuthority>();
		for (int i = 0; i < list.size(); i++) {
			Role rol=list.get(i);
			System.out.println(rol.getRoleCode());
			GrantedAuthorityImpl gi=new GrantedAuthorityImpl(rol.getRoleCode());
			rolelist.add(gi);
		}
		org.springframework.security.core.userdetails.User user=new org.springframework.security.core.userdetails.User(u.getUsername(), u.getPassword(),true, true, true, true, rolelist);
		return user;
	}
	public userDaoimp getUdi() {
		return udi;
	}
	public void setUdi(userDaoimp udi) {
		this.udi = udi;
	}
	
}

这样 整个配置完成

 

注意:个人管理器(userserviceDaoImp )必须继承 UserDetailsService 。但是其中权限的处理方法可能不同。上述的方法适用于Spring Security 3.*版本 对于Spring Security 4.*的话 处理方法不同 如下:

public class AuthuserService extends SqlSessionTemplate implements UserDetailsService{
	public AuthuserService(SqlSessionFactory sqlSessionFactory) {
		super(sqlSessionFactory);
	}

	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException {
		UserServices us=new UserServices(getSqlSessionFactory());
		List<role> list=us.getRoleByusername(username);
		System.out.println(list);
		List<GrantedAuthority> rolelist=new ArrayList<GrantedAuthority>();
		for (int i = 0; i < list.size(); i++) {
			role rol=list.get(i);
			System.out.println(rol.getRoleCode());
            //在Spring Security 4.*中移除了GrantedAuthorityImpl类。添加了SimpleGrantedAuthority
            //我们对权限的封装将采用这个类
			GrantedAuthority gi=new SimpleGrantedAuthority(rol.getRoleCode());
			rolelist.add(gi);
		}
		return new  User(username, "password", rolelist);
	}
	
}

 

转载于:https://my.oschina.net/u/2970507/blog/788301

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值