文档章节

配置Spring Security 权限标签

_Artisan
 _Artisan
发布于 2017/06/24 08:25
字数 1150
阅读 31
收藏 0
点赞 0
评论 0

在这里附上项目的地址,喜欢的可以给个star:https://git.oschina.net/huyup/shiyanshebeiguanlixinxixitong

1、Spring Security 所需的依赖

		<!-- spring-security -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-taglibs</artifactId>
			<version>${spring.version}</version>
		</dependency>

2、spring-security.xml 的配置

<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">

	<!-- 不拦截的资源 -->
	<http pattern="/static/**" security="none" />
	<http pattern="/login.jsp" security="none" />
	
	<http auto-config="true" use-expressions="false">
		<!-- 配置用户正常访问page-->
		<intercept-url pattern="/**" access="ROLE_USER"/>

		 <form-login login-page="/login.jsp"
					 username-parameter="user.userName"  
					 password-parameter="user.userPassword"
					 authentication-success-handler-ref="loginSuccessHandler"
					 authentication-failure-handler-ref="loginFailHandler"  /> 
	</http>
	
	
	<!--用户权限管理-->
    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userInfoProvider" >
        </authentication-provider>
    </authentication-manager>

    <!--用户信息Provider-->
    <beans:bean id="userInfoProvider" class="com.gxuwz.service.impl.UserInfoServiceImpl" />
    
    <!--登陆成功-->
    <beans:bean id="loginSuccessHandler" class="com.gxuwz.handler.MyLoginSuccessHandler" />
    
    <!--登陆失败-->
    <beans:bean id="loginFailHandler" class="com.gxuwz.handler.MyLoginFailHandler"/>  

</beans:beans>

3、用户实体代码(与角色是多对多的关系,在这就不贴角色实体的代码了)

package com.gxuwz.entity;

import java.util.*;
import javax.persistence.*;
import org.springframework.security.core.*;

/**
 * 用户实体
 * @author 小胡  
 * @date 2017年5月28日
 */
@Entity
@Table(name = "sys_user")
public class SysUser extends BaseEntity implements UserDetails{

	private static final long serialVersionUID = 103889943178214590L;

	@Column(name = "user_name", unique = true, nullable = false)
	private String userName; // 用户名
	@Column(name = "user_password")
	private String userPassword; // 密码
	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "sys_user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
	private Set<SysRole> user_role; // 所属角色
	@Column(name = "telephone")
	private String telephone; // 电话
	@Column(name = "user_create_date")
	private String createDate; // 创建日期
	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "sys_user_lab", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "lab_id"))
	private Set<SysLaboratory> user_lab;

	public SysUser() {

	}
        // 省略属性的get、set的方法
	
	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		Set<GrantedAuthority> auths = new HashSet<>();
        Set<SysRole> roles = this.getUser_role();
		// 默认所有的用户有"USER"的权利
        auths.add(new SimpleGrantedAuthority("ROLE_USER"));
        for (SysRole role : roles) {
            auths.add(new SimpleGrantedAuthority(role.getRoleName()));  //获得该用户所拥有的权限
        }
        return auths;
	}

	@Override
	public String getPassword() {
		return this.userPassword;
	}

	@Override
	public String getUsername() {
		return this.userName;
	}

	@Override
	public boolean isAccountNonExpired() {
		return true;
	}

	@Override
	public boolean isAccountNonLocked() {
		return true;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		return true;
	}

	@Override
	public boolean isEnabled() {
		return true;
	}

}

4、用户信息的DAO

package com.gxuwz.dao;

import com.gxuwz.entity.SysUser;

public interface IUserInfoDao {
	public SysUser getUserByName(String username);
}

package com.gxuwz.dao.impl;

import javax.annotation.Resource;

import org.hibernate.*;
import org.springframework.*;

import com.gxuwz.dao.IUserInfoDao;
import com.gxuwz.entity.SysUser;

@Repository("userInfoDao")
public class UserInfoDaoImpl extends HibernateDaoSupport implements
		IUserInfoDao {

	@Resource(name = "sessionFactory")
	public void setSuperSessionFactory(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
	}

	@Override
	public SysUser getUserByName(String username) {
		Query query = this.getSession().createQuery(
				"from SysUser where user_name = ?");
		query.setString(0, username);
		SysUser user = (SysUser) query.uniqueResult();
		if (user == null) {
			return null;
		}else{
			return user;
		}
	}

}

5、用户信息的SERVICE

package com.gxuwz.service;

import org.springframework.security.core.userdetails.UserDetailsService;

public interface IUserInfoService extends UserDetailsService{

}

package com.gxuwz.service.impl;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.gxuwz.dao.IUserInfoDao;
import com.gxuwz.entity.SysUser;
import com.gxuwz.service.IUserInfoService;

@Service("userInfoService")
public class UserInfoServiceImpl implements IUserInfoService {

	@Resource(name = "userInfoDao")
	private IUserInfoDao userInfoDao;

	@Override
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException {
		System.out.println("service login...");
		if (StringUtils.isNotEmpty(username)) {
			SysUser user = userInfoDao.getUserByName(username.trim());
			if (user != null) {
				System.out.println("用户名:"+user.getUsername()+" "+"密码:"+user.getPassword());
				return user;
			}
		}
		throw new UsernameNotFoundException(
				"Can't not find user while username is '" + username.trim()
						+ "'");
	}

}

6、struts2 的登陆的方法

	@LogMsg(msg="用户登陆")  // 这里使用Spring AOP的日志管理,具体看参考上一篇文章
	public String doLogin(){
		setPrompt("/WEB-INF/pages/main.jsp");	
		return SUCCESS;
	}

7、登陆页面的链接使用Spring Security自带的

    <ul>
    	<div style="padding:5px;text-align:center;color: red;">${msg}</div> 
    	<form name="loginForm" method="post" action="<%=basePath%>j_spring_security_check"> 
    	<li><input name="user.userName" type="text" class="loginuser" value="admin" onclick="JavaScript:this.value=''"/></li>
    	<li><input name="user.userPassword" type="password" class="loginpwd" value="密码" onclick="JavaScript:this.value=''"/></li>
    	<li><input name="" type="submit" class="loginbtn" value="登录" />
    	<label><input name="" type="checkbox" value="" checked="checked" />记住密码</label><label>
    	<a href="#">忘记密码?</a></label></li>
    	</form>
    </ul>

8、自定义的登陆成功和失败的处理

package com.gxuwz.handler;

import java.io.IOException;

import javax.annotation.Resource;
import javax.servlet.*;
import org.springframework.security.*;

import com.gxuwz.entity.SysUser;
import com.gxuwz.service.IUserInfoService;

/**
 * 配置登陆成功处理器
 * @author h
 *
 */
public class MyLoginSuccessHandler implements AuthenticationSuccessHandler {

	@Resource(name = "userInfoService")
	private IUserInfoService userInfoService;

	@Override
	public void onAuthenticationSuccess(HttpServletRequest req,
			HttpServletResponse resp, Authentication authentication)
			throws IOException, ServletException {
		SysUser user = null;
		Object o = SecurityContextHolder.getContext().getAuthentication()
				.getPrincipal();
		if (o != null && o instanceof SysUser) {
			user = (SysUser) o;
			resp.sendRedirect("User_doLogin.action");
			System.out.println("密码:" + user.getPassword());
			HttpSession session = req.getSession();
			if (session != null) {
				session.setAttribute("user", user);
			}
		}
	}

}

package com.gxuwz.handler;

import java.io.IOException;

import javax.servlet.*;
import org.springframework.security.*;

import com.gxuwz.common.Const;

/**
 * 配置登陆失败处理器
 * @author h
 *
 */
public class MyLoginFailHandler implements AuthenticationFailureHandler {

	@Override
	public void onAuthenticationFailure(HttpServletRequest req,
			HttpServletResponse resp,
			AuthenticationException authenticationexception)
			throws IOException, ServletException {
		resp.sendRedirect("login.jsp");
		HttpSession session = req.getSession();
		if (session != null) {
			session.setAttribute("msg", Const.LOGIN_ERROE_MSG);
		}
	}

}


9、具体的权限标签在WEB-INF/pages/left.jsp

    <!-- 权限标签 -->
    <!-- ifAllGranted,只有当前用户同时拥有 ROLE_ADMIN 和 ROLE_USER 两个权限时,才能显示标签内部内容 -->
    <!-- ifAnyGranted,如果当前用户拥有 ROLE_ADMIN 或 ROLE_USER 其中一个权限时,就能显示标签内部内容 --> 
    <!-- ifNotGranted,如果当前用户没有 ROLE_ADMIN 时,才能显示标签内部内容 -->
    <dd>
    <div class="title">
    <span><img src="static/images/leftico01.png" /></span>基本信息</div>
    	<ul class="menuson">
        <li  class="active"><cite></cite><a href="PageFrame_index.action" target="rightFrame">首页</a><i></i></li>
        <sec:authorize ifAnyGranted="ROLE_ADMIN">
        <li><cite></cite><a href="Department_listPrompt.action" target="rightFrame">部门列表</a><i></i></li>
        <li><cite></cite><a href="Laboratory_listPrompt.action" target="rightFrame">实验室列表</a><i></i></li>
        </sec:authorize>
        <sec:authorize ifAnyGranted="ROLE_ADMIN,ROLE_TCH,ROLE_TECH">
        <li><cite></cite><a href="Equipment_listPrompt.action" target="rightFrame">设备列表</a><i></i></li>
        </sec:authorize>
        <sec:authorize ifAnyGranted="ROLE_ADMIN">
        <li><cite></cite><a href="Role_listPrompt.action" target="rightFrame">角色列表</a><i></i></li>
        <li><cite></cite><a href="User_listPrompt.action" target="rightFrame">用户列表</a><i></i></li>
        </sec:authorize>
        </ul>    
    </dd>

© 著作权归作者所有

共有 人打赏支持
_Artisan
粉丝 7
博文 41
码字总数 15711
作品 0
梧州
Spring Security实现RBAC权限管理

Spring Security实现RBAC权限管理 一简介 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security。由于Spring Boot非常的流行,选择...

小忽悠
06/21
0
0
使用 Spring Security 保护 Web 应用的安全 转载

在 Web 应用开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境...

小样
2012/08/24
0
0
使用 Smart Security 实现安全控制

很多朋友都问过我同样一个问题:“Smart 目前有身份认证与权限管理等安全控制功能吗?” 当听到这样的问题时,我真的非常不好意思,实在是没有这方面的特性。不过当我学习了 Shiro 以后,让我...

黄勇
2014/03/31
0
11
让Spring Security 来保护你的Spring Boot项目吧

参考资料: 书籍:Spring实战(第4版) 第9章和第14章 Spring Security 参考手册 初识 Spring Security 程序猿DD的Spring Security学习笔记 Spring Security 简介 Spring Security是一个能够为...

潇潇漓燃
05/19
0
0
spring security3.x学习(20)_初探authorize标签和第四个例子

本文为转载学习 原文链接:http://blog.csdn.net/dsundsun/article/details/11880743 第四个例子也就是spring security3那本书中的第五章的例子。 csdn下载:http://download.csdn.net/deta...

heroShane
2014/02/02
0
0
spring security

Spring Security 为基于 J2EE 企业应用软件提供了全面安全服务。安全主要包括两个操作“认证”与“验证”(有时候也会叫做权限控制)。“认证”是为用户建立一个其声明的角色的过程,这个角色...

peiquan
07/04
0
0
敬献Spring Security-3.x官方文档中文版

因机房被封,网站暂时无法访问,请耐心等待,诚心祷告早日恢复。 Spring Security-3.x新近发布,整体的项目结构和包名都出现了天翻地覆的变化,与此同时,Spring Security-3.x中也提供了ses...

hans汉斯
2010/01/21
0
0
SpringMVC 3.1集成Spring Security 3.1

这篇算是一个入门文章,昨天看见有网友提问,spring mvc集成spring security 的时候出错,揣测了一下问题木有解决。我就帮忙给搭建了一个集成框架他说可以,他告诉我这样的文章网上少。今天我...

mrliuze
2016/11/24
25
0
敬献Spring Security-3.x官方文档中文版

因机房被封,网站暂时无法访问,请耐心等待,诚心祷告早日恢复。 Spring Security-3.x新近发布,整体的项目结构和包名都出现了天翻地覆的变化,与此同时,Spring Security-3.x中也提供了ses...

hans汉斯
2010/01/21
0
1
Spring Security系列四 自定义决策管理器(动态权限码)

前言 前面我们已经实现了用户的自定义登录及密码的加密,接下来就是动态的权限验证了,也就是实现Spring Security的决策管理器AccessDecisionManager。 权限资源 SecurityMetadataSource 要实...

Airship
2017/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
12分钟前
0
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
12分钟前
6
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
22分钟前
0
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
24分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
26分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
29分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
33分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
37分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
40分钟前
0
0
RobotThread.cpp

#include "RobotThread.h"RobotThread::RobotThread(int argc, char** pArgv, const char * topic) :m_Init_argc(argc), m_pInit_argv(pArgv), m_topic(topic){/** ......

itfanr
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部