品优购14——用户中心

1. 单点登录实现

1.1 引入依赖

<!-- security依赖 -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-web</artifactId>
	<version>4.1.0.RELEASE</version>
</dependency>

<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-config</artifactId>
	<version>4.1.0.RELEASE</version>
</dependency>

<!-- cas相关 -->
<dependency>  
	   <groupId>org.springframework.security</groupId>  
	   <artifactId>spring-security-cas</artifactId>  
	   <version>4.1.0.RELEASE</version>  
</dependency>     
<dependency>  
<groupId>org.jasig.cas.client</groupId>  
<artifactId>cas-client-core</artifactId>  
<version>3.3.3</version>  
<exclusions>  
    <exclusion>  
	<groupId>org.slf4j</groupId>  
	<artifactId>log4j-over-slf4j</artifactId>  
    </exclusion>  
</exclusions>  
</dependency>

1.2 配置security监听

<!-- 配置security -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:spring/spring-security.xml</param-value>
 </context-param>
 <listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
 </listener>
<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>

1.3 配置SpringSecurity的配置文件

<?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.xsd
						http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
	
	<!-- 配置放行 -->
	<http pattern="/css/**" security="none"></http>
	<http pattern="/img/**" security="none"></http>
	<http pattern="/js/**" security="none"></http>
	<http pattern="/plugins/**" security="none"></http>
	
	<http pattern="/register.html" security="none"></http>
	<http pattern="/user/add.do" security="none"></http>
	<http pattern="/user/sendCode.do" security="none"></http>
	
	<!--   entry-point-ref  入口点引用 -->
	<!--
		entry-point-ref:登录点引用。因为我们要集成CAS,那么登录就不会在本地项目中了,所以这时候我们本地的login.html就不需要了
						 ,而是使用的CAS配置的登录页面casProcessingFilterEntryPoint就是下面的CAS入口点配置的id值
	-->
	<http use-expressions="false" entry-point-ref="casProcessingFilterEntryPoint">  
        <intercept-url pattern="/**" access="ROLE_USER"/>   
        <csrf disabled="true"/>  
        <!-- 
			SpringSecurity过滤器配置,在SpringSecurity中,可以在配置文件中配置过滤器,这样在web.xml中就不需要配置过滤器了
			在springsecurity中内置了很多过滤器,每一个过滤器都有一个别名
			custom-filter为过滤器标签, 
			position 表示将过滤器放在指定的位置上,
			before表示放在指定位置之前  ,
			after表示放在指定的位置之后  
		-->        
		<!-- 表示在当前http拦截当中,配置一个过滤器,这个过滤器在CAS_FILTER上出现 -->   
        <custom-filter ref="casAuthenticationFilter"  position="CAS_FILTER" />  
		<!-- 请求单点登出过滤器,在过滤器LOGOUT_FILTER的前面执行  该过滤器是CAS原生包提供的 -->
        <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>  
		<!-- 请求单点登出过滤器,在过滤器CAS_FILTER的位置处执行  该过滤器是SpringSecurity提供的 -->
        <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>  
    </http>
    
  	<!-- CAS入口点 开始 -->
    <beans:bean id="casProcessingFilterEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">  
        <!-- 单点登录服务器登录URL -->  
        <beans:property name="loginUrl" value="http://localhost:9100/cas/login"/>  
        <beans:property name="serviceProperties" ref="serviceProperties"/>  
    </beans:bean>      
    <beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">  
        <!--service 配置自身工程的根地址+/login/cas   -->  
        <beans:property name="service" value="http://localhost:9106/login/cas"/>
    </beans:bean>  
    <!-- CAS入口点 结束 -->

    
    <!-- 认证过滤器 开始 -->
    <beans:bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">  
        <beans:property name="authenticationManager" ref="authenticationManager"/>  
    </beans:bean>  
		<!-- 认证管理器 -->
	<authentication-manager alias="authenticationManager">
		<authentication-provider  ref="casAuthenticationProvider">
		</authentication-provider>
	</authentication-manager>
		<!-- 认证提供者 -->
	<beans:bean id="casAuthenticationProvider"     class="org.springframework.security.cas.authentication.CasAuthenticationProvider">  
        <beans:property name="authenticationUserDetailsService">  
            <beans:bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">  
                <beans:constructor-arg ref="userDetailsService" />  
            </beans:bean>  
        </beans:property>  
        <beans:property name="serviceProperties" ref="serviceProperties"/>  
        <!-- ticketValidator 为票据验证器 -->
        <beans:property name="ticketValidator">  
            <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">  
                <beans:constructor-arg index="0" value="http://localhost:9100/cas"/>  
            </beans:bean>  
        </beans:property>  
        <beans:property name="key" value="an_id_for_this_auth_provider_only"/> 
    </beans:bean>    
        
   	<!-- 认证类 -->
	<beans:bean id="userDetailsService" class="com.pinyougou.user.service.UserDetailServiceImpl"/>  
	
	<!-- 认证过滤器 结束 -->
	
	
	<!-- 单点登出  开始  -->     
	<!-- 对服务端进行单点登出 -->
    <beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>  
	<!-- 主要是用来配置下面的地址信息的
		经过此配置,当用户在地址栏输入本地工程/logout/cas即,在地址栏输入/logout/cas就相当于输入了http://localhost:9100/cas/logout?service=http://www.baidu.com
	-->
    <beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">  
        <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://localhost:9003/logout.html"/>  
        <beans:constructor-arg>  
            <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>  
        </beans:constructor-arg>  
        <beans:property name="filterProcessesUrl" value="/logout/cas"/>  
    </beans:bean>  
    <!-- 单点登出  结束 -->  
	
</beans:beans>

1.4 编写认证类

package com.pinyougou.user.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
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;

/**
 * 认证类
 * @author Administrator
 *
 */
public class UserDetailServiceImpl implements UserDetailsService{
	

	/* 
	 * username  是用户登录的时候输入的用户名
	 * 返回null   就登录失败
	 */
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		System.out.println("认证类开始:" + username);
		// 获取角色组
		List<GrantedAuthority> authorities = new ArrayList<>();
		// 注意:这里的角色名称要和配置文件中<intercept-url pattern="/**" access="ROLE_USER"/>的角色名称一样
		GrantedAuthority e = new SimpleGrantedAuthority("ROLE_USER");
		authorities.add(e );
		
		/*
		 * 注意:这里的第二个参数是密码,可以给空,因为这个类已经不做认证了,所以可以随便写什么,关键的是第三个参数,所有的角色列表
		 * */
		return new User(username, "", authorities); 
	}

}

测试发现,页面一直进不去,经过排查,是没有配置欢迎页,配置欢迎页

<!-- 配置欢迎页 -->
<welcome-file-list>
  <welcome-file>home-index.html</welcome-file>
</welcome-file-list>

2. 页面显示登录名

如果是jsp页面的话,可以直接使用jsp脚本表达式,但是我们项目是html,所以,我们需要定义一个控制器,用于获取用户名

2.1 控制层

package com.pinyougou.user.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**用户登录控制层
 * @author Administrator
 *
 */
@RestController
@RequestMapping("/login")
public class LoginController {
	
	@RequestMapping("/showName")
	public Map<String,Object> showName(){
		Map<String, Object> map = new HashMap<String, Object>();
		String name = SecurityContextHolder.getContext().getAuthentication().getName();
		if(StringUtils.isEmpty(name)){
			map.put("loginName", null);
		} else {
			map.put("loginName", name);
		}
		return map;
	}

}

2.2 前端

1)在controller目下添加LoginController.js 

 //控制层 
app.controller('loginController' ,function($scope,userService){	
	// 获取登录的用户名
	$scope.showName = function() {
		userService.showName().success(function(res) {
			if(res.loginName){
				console.log(res.loginName);
				$scope.loginName = res.loginName; // loginName
			}
		});
	}
	
});	

2)修改userService.js

// 获取登录用户名
this.showName = function() {
	return $http.get('../login/showName.do');
}

3)界面引入

引入头文件

    
    <!-- 引入angularjs -->
    <script type="text/javascript" src="plugins/angularjs/angular.min.js"></script>
    
    <!-- 引入js文件 -->
    <script type="text/javascript" src="js/base.js"></script>
    <script type="text/javascript" src="js/service/userService.js"></script>
    <script type="text/javascript" src="js/controller/loginController.js"></script>

添加指令

将显示登录名的地方用插值表达式

3. 退出登录

退出登录操作就很简单了,只需要两步

1)修改SpringSecurity的配置文件的登出配置url

注意:这里直接退出到门户首页

2)在页面添加退出登录连接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值