spring security 基于角色的控制,可运行。
基于角色的访问控制
建表语句,见 上一篇 的博文, https://www.cnblogs.com/sdgtxuyong/p/16157870.html
在配置类中,@EnableGlobalMethodSecurity(securedEnabled=true),启用那个级别的认证,就要在控制器中,用哪个注解,否则不起作用。这里是用@Secured,注解。
用户 user 继承自 UserDetails
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user")
public class User implements UserDetails {
@TableField(exist = false)
private List<Role> roles;
private static final long serialVersionUID = 1L;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles;
}
角色继承自 GrantedAuthority ,这个词,在springsecurity中,代表角色
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_role")
public class Role implements GrantedAuthority {
@Override
public String getAuthority() {
return roleName;
}
@TableField(exist = false)
private List<Permission> permissionList;
dao
userdao中,返回值 封装 roles 类型
@Repository
@Transactional
public interface UserDao extends BaseMapper<User> { @Select("select * from sys_user where username = #{username}")
@Results({
@Result(id = true, property = "id", column = "id"),
@Result(property = "roles", column = "id", javaType = List.class,
many = @Many(select = "cn.taotao.dao.RoleDao.findByUid"))
})
public User findByName(String username); @Select("select * from sys_user where id=#{id}")
@Results({
@Result(id=true, column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(javaType = List.class,property = "roles",column = "id",
many=@Many(select="cn.taotao.dao.RoleDao.findRoleById"))
})
User findUserAndRoleById(int id); }
roleDao
@Repository
@Transactional
public interface RoleDao extends BaseMapper<Role> { @Select("SELECT r.id, r.role_name roleName, r.role_desc roleDesc " +
"FROM sys_role r, sys_user_role ur " +
"WHERE r.id=ur.rid AND ur.uid=#{uid}")
public List<Role> findByUid(Integer uid); @Select("SELECT * FROM sys_role r ,sys_user_role ur WHERE r.`ID`=ur.`RID`AND ur.`UID`=#{id}" )
@Results({
@Result(id = true, property = "id",column = "id"),
@Result(property = "roleName",column = "role_name"),
@Result(property = "roleDesc",column = "role_desc"),
@Result(property = "permissionList",column = "rid",many = @Many(select="cn.taotao.dao.PermissionDao.findPermissionAndRoleById"))
})
List<Role> findRoleById(int id);
}
permissionDao
@Repository
@Transactional
public interface PermissionDao extends BaseMapper<Permission> { @Select("SELECT * FROM sys_permission p ,sys_role_permission rp WHERE p.`ID`=rp.`PID` AND rp.`RID`=#{id}")
public List<Permission> findPermissionAndRoleById(int id);
}
服务层
public interface UserService extends IService<User> , UserDetailsService {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, cn.taotao.domain.User> implements UserService { @Autowired
private UserDao userDao; @Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
// cn.taotao.domain.User user = userDao.findByName(s);
// 这些注释掉的,都不需要
// //根据用户的id查询用户的权限
// // List<String> permissions = userDao.findPermissionsByUserId(user.getId());
// cn.taotao.domain.User userAndRoleById = userDao.findUserAndRoleById(user.getId());
// List<String> permissionLists = new ArrayList<>();
// userAndRoleById.getRoles().forEach(o->o.getPermissionList().forEach(e->{permissionLists.add(e.getPermissionName());}));
// //将permissions转成数组
// String[] permissionArray = new String[permissionLists.size()];
// permissionLists.toArray(permissionArray);
// permissionLists.forEach(o-> System.out.println(o));
// System.err.println("permissionArray = " + permissionArray.toString());
// UserDetails userDetails = User.withUsername(user.getUsername()).password(user.getPassword()).authorities(permissionArray).build();
// System.err.println("userDetails = " + userDetails);
return userDao.findByName(s); }
异常处理
@ControllerAdvice
public class HandlerControllerException { @ExceptionHandler(RuntimeException.class)
public String handException(RuntimeException e){
if(e instanceof AccessDeniedException){
return "redirect:/403.jsp";
}
return "redirect:/500.jsp";
}
}
配置类
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled=true) // 这里有3个类型可选,用来区分安全级别,有spring的,有springmvc的,有jsr250的,如果这里启用哪个,在控制器中,就必须用那个,来控制权限。
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired
private UserService userService; @Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
} //指定认证对象的来源
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
}
//SpringSecurity配置信息
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login.jsp", "failer.jsp","403.jsp","500.jsp", "/number.jpg","/static/**","/css/**", "/img/**", "/plugins/**").permitAll()
// .antMatchers("/add").hasAnyRole("admin")
.anyRequest().authenticated()
// .anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login.jsp")
.loginProcessingUrl("/login")
.successForwardUrl("/index.jsp")
.failureForwardUrl("/failer.jsp")
.and()
.logout()
.logoutSuccessUrl("/logout")
.invalidateHttpSession(true)
.logoutSuccessUrl("/login.jsp")
.and()
.csrf()
.disable()
.rememberMe()
.tokenRepository(getPersistentTokenRepository())
.tokenValiditySeconds(3600)
.userDetailsService(userDetailsService);
} @Autowired
private DataSource dataSource; //记住我后的登录页面
@Autowired
private UserDetailsService userDetailsService;
//记住我的功能
@Bean
public PersistentTokenRepository getPersistentTokenRepository() {
JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl=new JdbcTokenRepositoryImpl();
jdbcTokenRepositoryImpl.setDataSource(dataSource);
//启动时创建一张表,这个参数到第二次启动时必须注释掉,因为已经创建了一张表
// jdbcTokenRepositoryImpl.setCreateTableOnStartup(true);
return jdbcTokenRepositoryImpl;
} }
控制器
@RequestMapping("/updateOrder/{id}")
// @PreAuthorize("hasAuthority('updateOrder')")
@Secured("ROLE_ADMIN")
public ModelAndView updateOrder(@PathVariable("id") Long id,@RequestParam("comment") String comment){
ModelAndView mv = new ModelAndView(); this.ordersService.update(this.ordersService.getById(id), new UpdateWrapper<Orders>().eq("id",id).set("comment",comment)); mv.setViewName("redirect:/list");
return mv; }
jsp页面
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <sec:authorize access="hasAnyRole('ROLE_ADMIN')"> <button type="submit" class="btn btn-primary" style="margin-top: 30px">修改备注</button></sec:authorize>
spring security 基于角色的控制,可运行。的更多相关文章
- rbac(基于角色权限控制)-------权限管理
权限管理 创建一个rbac和app的应用,这个rbac主要是用来存放权限的,全称叫做基于角色权限控制 一.先看配置文件合适不,给创建的rbac在配置文件里面设置一下 找到INSTALLED_APPS= ...
- 别再让你的微服务裸奔了,基于 Spring Session & Spring Security 微服务权限控制
微服务架构 网关:路由用户请求到指定服务,转发前端 Cookie 中包含的 Session 信息: 用户服务:用户登录认证(Authentication),用户授权(Authority),用户管理(R ...
- spring boot系列--spring security (基于数据库)登录和权限控制
先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig 1 @Configuration 2 @EnableWebSecurity 3 publ ...
- Spring Security基于Java配置
Maven依赖 <dependencies> <!-- ... other dependency elements ... --> <dependency> < ...
- spring-security-4 (2)spring security 基于Java配置的搭建
一.spring security的模块 搭建spring security首先我们要导入必须的jar,即maven的依赖.spring security按模块划分,一个模块对应一个jar. spri ...
- Spring Security 动态url权限控制(三)
一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...
- Spring Security 基于URL的权限判断
1. FilterSecurityInterceptor 源码阅读 org.springframework.security.web.access.intercept.FilterSecurityI ...
- php_ThinkPHP的RBAC(基于角色权限控制)详解
一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通 ...
- MVC基于角色权限控制--数据库设计
在网站后台设计过程中都会遇上权限控制这一问题 当前较为流行的解决方案是基于角色的权限管理 基本思路如下 分别建立 用户信息表.角色信息表.权限信息表 让用户和角色关联,角色和权限关联,当用户访问时,通 ...
- Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定
一.说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼.本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring ...
随机推荐
- PostgreSQL Repmgr集群
一.概述 repmgr是一套开源工具,用于管理PostgreSQL服务器群集内的复制和故障转移.它支持并增强了PostgreSQL的内置流复制,该复制流提供了一个读/写主服务器以及一个或多个只读备用数 ...
- (五)REDIS-哨兵与集群
概念介绍: Sentinel(哨兵)是Redis的高可用性解决方案,主要是通过一个或多个Sentinel实例组成的Sentinel系统对任意多个主服务器以及这些主服务器的所有从服务器进行监视,当某个主 ...
- 15.网关Gateway
创建网关的Module 使用注册中心和配置中心 详细可以参考另两篇篇博客-注册中心和配置中心 报错 编译报了这个错,原因是我们没有给网关配置数据库连接字符串,但是引用了common,common中有m ...
- react 04 生命周期
生命周期的三个状态 mounting : 组件插入到dom updating: 将数据更新到dom unmounting:将组件移除dom 生命周期的钩子函数 ComponentWillMount: ...
- x-sheet 开发系列教程:初始化配置
介绍 x-sheet 是一款高性能 Web JavaScript Canvas 电子表格,之前小编写过一篇 x-sheet 入门体验,简单介绍了一下如何使用 x-sheet.这次我们继续深入一下,了解 ...
- ACE下载地址
https://download.dre.vanderbilt.edu/previous_versions/ 在某n中找了大半天愣是没人贴出来
- promethues【centos7】时间同步
Promethues和Grafana展示的监控突然消失了,服务器检查发现没什么异常. 当打开promethus网页后,发现有一个错误提示: Warning! Detected 60.44 second ...
- python调用c/c++方法
# python调用c/c++方法:一般先将c++代码转化为C类型dll(推荐使用静态dll,否则容易出现各种链接库问题;记得使用extern "C" _declspec(dlle ...
- monkey自动化脚本
获取第三方安装包:手机需root,adb shell>cd data/app>ls(获取相应app信息)>cd +相应app信息>base.apk(安装包) 获取第三方安装包: ...
- Activity 的窗口去头的方式
1\窗口去头的第一种方式 public class SplashActivity extends Activity { @Override protected void onCreate(Bundle ...