前言

spring自带角色权限控制框架

用户-角色

数据库和dimain

  • 数据库
-- 用户表
CREATE TABLE sys_user(
id int auto_increment PRIMARY KEY ,
username VARCHAR(50),
email VARCHAR(50) ,
PASSWORD VARCHAR(80),
phoneNum VARCHAR(20),
STATUS int(1)
); -- 角色表
CREATE TABLE sys_role(
id int auto_increment PRIMARY KEY,
roleName VARCHAR(50) ,
roleDesc VARCHAR(50)
)
-- 用户和角色中间表
CREATE TABLE sys_user_role(
userId int,
roleId int,
PRIMARY KEY(userId,roleId),
FOREIGN KEY (userId) REFERENCES sys_USER(id),
FOREIGN KEY (roleId) REFERENCES sys_role(id)
)
  • domain
public class SysUser {
private Long id;
private String username;
private String email;
private String password;
private String phoneNum;
private int status;
private List<Role> roles;
}
public class Role {
private Long id;
private String roleName;
private String roleDesc;
}

静态页面

403.jsp

login.jsp

error.jsp

配置文件

springSecurity.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd"> <!--放行未登录访问的页面-->
<security:http pattern="/login.jsp" security="none"></security:http>
<security:http pattern="/error.jsp" security="none"></security:http>
<security:http pattern="/css/**" security="none"></security:http>
<security:http pattern="/img/**" security="none"></security:http>
<security:http pattern="/pages/**" security="none"></security:http>
<security:http pattern="/plugins/**" security="none"></security:http>
<!--配置拦截器的路径规则
auto-config="true" 表示使用权限框架默认的配置
use-expressions="false" 关闭权限框架的表达式 spel
intercept-url 拦截请求资源的路径
access="ROLE_USER" 允许访问的条件 当前用户必须拥有ROLE_USER的角色才可以访问
-->
<security:http auto-config="true" use-expressions="true">
<!--权限框架支持多种角色的登录 角色之间的关系为or 或者的关系-->
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"></security:intercept-url>
<!--自定义页面的配置节点-->
<security:form-login login-page="/login.jsp"
login-processing-url="/login"
default-target-url="/index.jsp"
authentication-failure-url="/error.jsp"></security:form-login> <!--登录成功权限不足的处理-->
<security:access-denied-handler error-page="/403.jsp"></security:access-denied-handler>
<!--csrf关闭跨域请求的攻击-->
<security:csrf disabled="true"></security:csrf>
<!--
logout 退出请求的url路径 实际是页面点击按钮请求的地址
logout-success-url 成功注销后 跳转的页面
invalidate-session 设置session失效
-->
<security:logout logout-url="/logOut" logout-success-url="/login.jsp" invalidate-session="true"></security:logout> </security:http> <!--配置拦截后验证的节点-->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userService">
<!--自定义的加密工具类-->
<security:password-encoder ref="pwdEncoder"></security:password-encoder>
</security:authentication-provider>
</security:authentication-manager> <!--配置自定义的加密工具类,这里使用自带的-->
<bean id="pwdEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean> <!--开启注解支持-->
<security:global-method-security secured-annotations="enabled"/> </beans>

web.xml引入

  • 引入filter
<!--配置框架使用的filter过滤器-->
<filter>
<!--过滤器执行链名臣固定springSecurityFilterChain-->
<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>
  • 引入配置文件
<!--spring的listener-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml,classpath:springSecurity.xml</param-value>
</context-param>

service校验方法

  • 在service中继承spring接口
public interface SysUserService extends UserDetailsService {
@Override
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
  • 实现接口
@Service("userService")
public class SysUserServiceImpl implements SysUserService { @Autowired
private SysUserDao userDao; @Autowired
BCryptPasswordEncoder pwdEncoder; @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//得到数据库的用户
SysUser sysUser = userDao.findUserByName(username);
//框架的User对象用于验证返回 用户名 密码 用户的权限集合
//查询得到用户真正的角色集合返回
List<Role> roles =sysUser.getRoles();
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
///如果当前用户确实拥有角色 循环添加到集合中
if(roles!=null&&roles.size()>0){
for (Role role : roles) {
authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
}
} User user = new User(sysUser.getUsername(),sysUser.getPassword(),authorities);
return user; }
}

用户名的获取

  • 前台获取
# 方式一
${ sessionScope.SPRING_SECURITY_CONTEXT.authentication.principal.username } # 方式二
<security:authentication property="principal.username"/>
  • 后台获取
// 先获取到SecurityContext对象
SecurityContext context = SecurityContextHolder.getContext();
// 获取到认证的对象
Authentication authentication = context.getAuthentication();
// 获取到登录的用户信息
User user = (User) authentication.getPrincipal();
System.out.println(user.getUsername());

不同角色访问控制权限

jsp页面

<security:authorize access="hasAnyRole('ROLE_USER','ROLE_ADMIN')">
<li id="system-setting">
<a href="${pageContext.request.contextPath}/product/findByPageHelper">
<i class="fa fa-circle-o"></i> 产品管理
</a>
</li>
</security:authorize>

后台

  • springmcv.xml
<!--手打才能自动引入-->
<security:global-method-security secured-annotations="enabled"></security:global-method-security>
  • controller
@Secured("ROLE_ADMIN")
public class RoleController

security权限控制的更多相关文章

  1. 自定义Spring Security权限控制管理(实战篇)

    上篇<话说Spring Security权限管理(源码)>介绍了Spring Security权限控制管理的源码及实现,然而某些情况下,它默认的实现并不能满足我们项目的实际需求,有时候需要 ...

  2. Spring Security权限控制

    Spring Security官网 : https://projects.spring.io/spring-security/ Spring Security简介: Spring Security是一 ...

  3. spring security 3.1 实现权限控制

    spring security 3.1 实现权限控制 简单介绍:spring security 实现的权限控制,能够分别保护后台方法的管理,url连接訪问的控制,以及页面元素的权限控制等, secur ...

  4. 权限控制框架Spring Security 和Shiro 的总结

    关于权限控制,一开始感觉比较难,后来先是接触了Spring Security 学起来也比较吃力,再是学习了Shiro,感觉简单很多. 总体来说这些框架,主要做了两个事情 Authentication: ...

  5. Spring Security(17)——基于方法的权限控制

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  6. Spring Security(16)——基于表达式的权限控制

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

  7. 基于spring security 实现前后端分离项目权限控制

    前后端分离的项目,前端有菜单(menu),后端有API(backendApi),一个menu对应的页面有N个API接口来支持,本文介绍如何基于spring security实现前后端的同步权限控制. ...

  8. springboot整合security实现基于url的权限控制

    权限控制基本上是任何一个web项目都要有的,为此spring为我们提供security模块来实现权限控制,网上找了很多资料,但是提供的demo代码都不能完全满足我的需求,因此自己整理了一版. 在上代码 ...

  9. request.getRemoteUser() Spring Security做权限控制后

    一. request.getRemoteUser();//获取当前缓存的用户,比如Spring Security做权限控制后就会将用户登录名缓存到这里 request.getRemoteAddr(); ...

随机推荐

  1. 一款开源免费的办公套件系统:DzzOffice详细部署

    一.系统环境 个人建议centos 7 系统 cat /etc/redhat-release CentOS Linux release (Core) 基本更新 yum update -y 基本优化 关 ...

  2. 转 在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()

    在子线程中new一个Handler为什么会报以下错误? java.lang.RuntimeException:  Can't create handler inside thread that has ...

  3. 六、python中context.get()方法

    例:context.get('variant',False) 意思是如果context中不包括variant 就返回False.

  4. (转)在 CentOS7 上安装 MongoDB

    在 CentOS7 上安装 MongoDB 1 通过 SecureCRT 连接至 CentOS7 服务器: 2 进入到 /usr/local/ 目录: cd /usr/local 3 在当前目录下创建 ...

  5. BackgroundWorker的简单用法

    微软的官方例子 BackgroudWorker就是一个封装好的异步处理类(就是多线程,广泛用于winform开发中) 例子: 1.界面效果: 一个label,两个button 2.Form2.cs的代 ...

  6. Hadoop Metrics2

    来源:Hadoop Metrics2 Metrics are collections of information about Hadoop daemons, events and measureme ...

  7. Ibatis SqlMap映射关系总结

    一.一对一关系一对一关系即一对单个对象,下面举例说明:一对单个对象例如:<resultMap id="loadAResult" class="A"> ...

  8. js禁止微信浏览器下拉显示黑底查看网址,不影响内部Scroll

    开发项目跑在微信浏览器经常会遇到一个问题,微信浏览器下拉的时候会出现自带的黑色底色(显示网址)如下图: 网上好多js禁止操作的做法禁止了内部Scroll,导致页面不能滚动,上拉加载失效,例如这种做法: ...

  9. 推荐网站 explainshell.com

    ls 显示指定目录下的文件和目录,默认为当前目录. -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) -l 除文件名称外,亦将文件型态.权 ...

  10. AJAX同步问题

    @using ShippingRen.CommonV2.CloudStorage; @using ShippingRen.Api.ServiceModel.PublicDataEntity.Looku ...