Spring安全权限管理

合集下载

如何实现网站用户登录和权限管理(七)

如何实现网站用户登录和权限管理(七)

如何实现网站用户登录和权限管理一、用户登录的重要性在现如今的数字时代,几乎所有的应用和网站都需要用户进行登录以使用相关服务。

用户登录的作用不仅仅是为了识别用户身份,更重要的是为了实现用户个性化的体验和权限管理。

通过用户登录,网站可以根据用户的需求和喜好提供个性化的服务,并对权限进行管理,保护用户的隐私和数据安全。

二、实现用户登录的方式用户名密码登录用户名密码登录是最常见和简单的一种登录方式。

用户在网站注册账号时,输入自己的用户名和密码,并在下次登录时通过验证密码的正确性来确认用户身份。

这种方式简便易行,但安全性相对较低,容易被恶意攻击者破解用户密码。

第三方登录除了用户名密码登录外,越来越多的网站开始提供第三方登录方式,比如使用社交媒体账号(如微信、QQ、微博)进行登录。

这种登录方式不仅方便用户,还可以减少用户记忆多个账号密码的烦恼。

同时,第三方登录方式具有更高的安全性,因为用户的密码不会直接暴露在网站中,而是通过第三方进行验证和授权。

三、权限管理的重要性用户权限级别权限级别是指用户在网站中所拥有的操作权限。

根据用户需求和角色的不同,网站可以划分不同的权限级别,如管理员、普通用户、游客等。

不同的权限级别对应不同的操作权限,确保用户只能执行其具有权限的操作,提高网站的安全性和用户体验。

权限管理的实现方式权限管理可以通过多种方式实现,其中最常见的方式是基于角色的权限管理。

通过角色的划分,将一组相似权限的操作归为一个角色,并为不同用户分配不同的角色。

这样,当用户登录后,系统即可根据用户的角色来判断其所具有的操作权限,将不具备权限的操作隐藏或禁用,确保用户不能越权操作。

四、具体实现和技术选型用户登录实现用户登录的技术和工具很多,其中最常见的是使用session或token。

在用户登录成功后,服务端会生成一个session或token(一串类似于密钥的字符串),并在后续请求中通过验证session或token来确认用户身份。

springbootsecurity权限控制--@PreAuthorize的使用

springbootsecurity权限控制--@PreAuthorize的使用

springbootsecurity权限控制--@PreAuthorize的使⽤1. 说明security 鉴权⽅式常⽤的有两种配置,1、配置⽂件中配置;2、使⽤注解标注;他们都是基于 acess 表达式,如果需要⾃定义逻辑的鉴权认证,只需要⾃定义access 表达式即可。

本⽂只选取注解的⽅式,来讲解默认的 access 和⾃定义的 access 表达式2.基于注解的使⽤2.1 使⽤前提条件:注解默认不可⽤,通过开启注解:在配置类中开启注解 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @Secured:专门判断⽤户是否具有⾓⾊,可以写在⽅法或类上,参数以 ROLE_ 开头@PreAuthorize\PostAuthorize: PreAuthorize 访问的类或⽅法执⾏前判断权限,⽽ PostAuthorize 在执⾏之后,Post 基本不⽤;允许与 ROLE_ 开头。

2.2 基于默认的access表达式在登录的时候,需要将⽤户权限返回给security;security才能实现权限控制功能;具体步骤:登录时,实现 UserDetailService,重写 loadUserByUsername(String userName)⽅法。

根据 userName 来实现⾃⼰的业务逻辑返回 UserDetails 的实现类,需要⾃定义User 类实现 UserDetails,⽐较重要的⽅法是 getAuthorities(),⽤来返回该⽤户所拥有的权限@Datapublic class LoginUser implements UserDetails, Serializable {...@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {// 根据⾃定义逻辑来返回⽤户权限,如果⽤户权限返回空或者和拦截路径对应权限不同,验证不通过if (!permissions.isEmpty()) {List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();for (String temp : permissions) {GrantedAuthority au = new SimpleGrantedAuthority(temp);list.add(au);}return list;}return null;}}然后在需要权限控制的controller⽅法上,添加注解@PreAuthorize("hasAuthority('..*')");其中@PreAuthorize括号中就是access表达式。

Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

Springboot+SpringSecurity+JWT实现⽤户登录和权限认证⽰例如今,互联⽹项⽬对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,⽬前⽐较成熟的⼏种⼤家⽐较熟悉的模式,像RBAC 基于⾓⾊权限的验证,shiro框架专门⽤于处理权限⽅⾯的,另⼀个⽐较流⾏的后端框架是Spring-Security,该框架提供了⼀整套⽐较成熟,也很完整的机制⽤于处理各类场景下的可以基于权限,资源路径,以及授权⽅⾯的解决⽅案,部分模块⽀持定制化,⽽且在和oauth2.0进⾏了很好的⽆缝连接,在移动互联⽹的授权认证⽅⾯有很强的优势,具体的使⽤⼤家可以结合⾃⼰的业务场景进⾏选取和使⽤下⾯来说说关于单点登录中⽬前⽐较流⾏的⼀种使⽤⽅式,就是springsecurity+jwt实现⽆状态下⽤户登录;JWT在之前的篇章中⼤致提到过,使⽤jwt在分布式项⽬中进⾏⽤户信息的认证很⽅便,各个模块只需要知道配置的秘钥,就可以解密token中⽤户的基本信息,完成认证,很⽅便,关于使⽤jwt的基本内容可以查阅相关资料,或者参考我之前的⼀篇;整理⼀下思路1、搭建springboot⼯程2、导⼊springSecurity跟jwt的依赖3、⽤户的实体类,dao层,service层(真正开发时再写,这⾥就直接调⽤dao层操作数据库)4、实现UserDetailsService接⼝5、实现UserDetails接⼝6、验证⽤户登录信息的拦截器7、验证⽤户权限的拦截器8、springSecurity配置9、认证的Controller以及测试的controller项⽬结构pom⽂件<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- https:///artifact/org.springframework.security.oauth/spring-security-oauth2 --><dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId><version>2.3.5.RELEASE</version></dependency><!-- https:///artifact/org.springframework.security/spring-security-jwt --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-jwt</artifactId><version>1.0.10.RELEASE</version></dependency><!-- https:///artifact/org.springframework.security.oauth.boot/spring-security-oauth2-autoconfigure --><dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-autoconfigure</artifactId><version>2.1.4.RELEASE</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- mybatis依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies>application.propertiesserver.port=8091#数据库连接spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true spring.datasource.driver-class-name=com.mysql.jdbc.Driverername=rootspring.datasource.password=root#mybatis配置mybatis.type-aliases-package=com.congge.entitymybatis.mapper-locations=classpath:mybatis/*.xml#redis配置spring.session.store-type=redisspring.redis.database=0spring,redis.host=127.0.0.1spring.redis.port=6379spring.redis.pool.min-idle=10000spring.redis.timeout=30000为模拟⽤户登录,这⾥提前创建了⼀个测试使⽤的表,user实体类Userpublic class User {private Integer id;private String username;private String password;private String role;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", role='" + role + '\'' +'}';}}Jwt⼯具类,⽤于管理token相关的操作,可以单测使⽤public class TestJwtUtils {public static final String TOKEN_HEADER = "Authorization";public static final String TOKEN_PREFIX = "Bearer ";public static final String SUBJECT = "congge";public static final long EXPIRITION = 1000 * 24 * 60 * 60 * 7;public static final String APPSECRET_KEY = "congge_secret";private static final String ROLE_CLAIMS = "rol";public static String generateJsonWebToken(Users user) {if (user.getId() == null || user.getUserName() == null || user.getFaceImage() == null) {return null;}Map<String,Object> map = new HashMap<>();map.put(ROLE_CLAIMS, "rol");String token = Jwts.builder().setSubject(SUBJECT).setClaims(map).claim("id", user.getId()).claim("name", user.getUserName()).claim("img", user.getFaceImage()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)).signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact();return token;}/*** ⽣成token* @param username* @param role* @return*/public static String createToken(String username,String role) {Map<String,Object> map = new HashMap<>();map.put(ROLE_CLAIMS, role);String token = Jwts.builder().setSubject(username).setClaims(map).claim("username",username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)).signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact();return token;}public static Claims checkJWT(String token) {try {final Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims;} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取⽤户名* @param token* @return*/public static String getUsername(String token){Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody();return claims.get("username").toString();}/*** 获取⽤户⾓⾊* @param token* @return*/public static String getUserRole(String token){Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody();return claims.get("rol").toString();}/*** 是否过期* @param token* @return*/public static boolean isExpiration(String token){Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody();return claims.getExpiration().before(new Date());}public static void main(String[] args) {String name = "acong";String role = "rol";String token = createToken(name,role);System.out.println(token);Claims claims = checkJWT(token);System.out.println(claims.get("username"));System.out.println(getUsername(token));System.out.println(getUserRole(token));System.out.println(isExpiration(token));}/*** eyJhbGciOiJIUzI1NiJ9.* eyJzdWIiOiJjb25nZ2UiLCJpZCI6IjExMDExIiwibmFtZSI6Im51b3dlaXNpa2kiLCJpbWciOiJ3d3cudW9rby5jb20vMS5wbmciLCJpYXQiOjE1NTQ5OTI1NzksImV4cCI6MTU1NTU5NzM3OX0. * 6DJ9En-UBcTiMRldZeevJq3e1NxJgOWryUyim4_-tEE** @param args*//*public static void main(String[] args) {Users user = new Users();user.setId("11011");user.setUserName("nuoweisiki");user.setFaceImage("/1.png");String token = generateJsonWebToken(user);System.out.println(token);Claims claims = checkJWT(token);if (claims != null) {String id = claims.get("id").toString();String name = claims.get("name").toString();String img = claims.get("img").toString();String rol = claims.get("rol").toString();System.out.println("id:" + id);System.out.println("name:" + name);System.out.println("img:" + img);System.out.println("rol:" + rol);}}*/}操作数据库的类,这⾥主要是提供⽤户注册的⼀个save⽤户的⽅法,@Servicepublic class UserService {@Autowiredprivate UserDao userDao;public void save(User user) {user.setId(1);userDao.save(user);}}JwtUser该类封装登录⽤户相关信息,例如⽤户名,密码,权限集合等,需要实现UserDetails 接⼝,public class JwtUser implements UserDetails {private Integer id;private String username;private String password;private Collection<? extends GrantedAuthority> authorities;public JwtUser() {}// 写⼀个能直接使⽤user创建jwtUser的构造器public JwtUser(User user) {id = user.getId();username = user.getUsername();password = user.getPassword();authorities = Collections.singleton(new SimpleGrantedAuthority(user.getRole()));}public Collection<? extends GrantedAuthority> getAuthorities() {return authorities;}public String getPassword() {return password;}public String getUsername() {return username;}public boolean isAccountNonExpired() {return true;}public boolean isAccountNonLocked() {return true;}public boolean isCredentialsNonExpired() {return true;}public boolean isEnabled() {return true;}@Overridepublic String toString() {return "JwtUser{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", authorities=" + authorities +'}';}}配置拦截器JWTAuthenticationFilterJWTAuthenticationFilter继承于UsernamePasswordAuthenticationFilter该拦截器⽤于获取⽤户登录的信息,只需创建⼀个token并调⽤authenticationManager.authenticate()让spring-security去进⾏验证就可以了,不⽤⾃⼰查数据库再对⽐密码了,这⼀步交给spring去操作。

权限管理

权限管理

权限管理权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。

权限管理几乎出现在任何系统里面,只要有用户和密码的系统。

很多人,常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。

目录一,权限管理场景举例二,权限管理分类三,容易混淆的概念四,权限管理技术实现五,权限管理实施六,不良的权限管理系统,必然留下系统漏洞一,权限管理场景举例企业IT管理员一般都能为系统定义角色,给用户分配角色。

这就是最常见的基于角色访问控制。

场景举例:1,给张三赋予“人力资源经理”角色,“人力资源经理”具有“查询员工”、“添加员工”、“修改员工”和“删除员工”权限。

此时张三能够进入系统,则可以进行这些操作;2,去掉李四的“人力资源经理”角色,此时李四就不能够进行系统进行这些操作了。

以上举例,局限于功能访问权限。

还有一些更加丰富、更加细腻的权限管理。

比如:1,因为张三是北京分公司的“人力资源经理”,所以他能够也只能够管理北京分公司员工和北京分公司下属的子公司(海淀子公司、朝阳子公司、西城子公司、东城子公司等)的员工;2,因为王五是海淀子公司的“人力资源经理”,所以他能够也只能够管理海淀子公司的员工;3,普通审查员审查财务数据的权限是:在零售行业审核最高限额是¥50万,在钢铁行业最高限额是¥1000万;高级审查员不受该限额限制;4,ATM取款每次取款额不能超过¥5000元,每天取款总额不能超过¥20000元。

这些权限管理和数据(可以统称为资源)直接相关,又称为数据级权限管理、细粒度权限管理或者内容权限管理。

二,权限管理分类从控制力度来看,可以将权限管理分为两大类:1,功能级权限管理;2,数据级权限管理。

从控制方向来看,也可以将权限管理分为两大类:1,从系统获取数据,比如查询订单、查询客户资料;2,向系统提交数据,比如删除订单、修改客户资料。

三,容易混淆的概念用户身份认证,根本就不属于权限管理范畴。

SpringBoot监控管理模块actuator没有权限的问题解决方法

SpringBoot监控管理模块actuator没有权限的问题解决方法

SpringBoot监控管理模块actuator没有权限的问题解决⽅法SpringBoot 1.5.9 版本加⼊actuator依赖后,访问/beans 等敏感的信息时候报错,如下Tue Mar 07 21:18:57 GMT+08:00 2017There was an unexpected error (type=Unauthorized, status=401).Full authentication is required to access this resource.肯定是权限问题了。

有两种⽅式: 1.关闭权限:application.properties添加配置参数management.security.enabled=false2.添加权限(未测试):<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>在property中配置权限ID描述敏感(Sensitive)autoconfi g 显⽰⼀个auto-configuration的报告,该报告展⽰所有auto-configuration候选者及它们被应⽤或未被应⽤的原因truebeans显⽰⼀个应⽤中所有Spring Beans的完整列表true configprops显⽰⼀个所有@ConfigurationProperties的整理列表true dump执⾏⼀个线程转储true env暴露来⾃Spring ConfigurableEnvironment的属性truehealth 展⽰应⽤的健康信息(当使⽤⼀个未认证连接访问时显⽰⼀个简单的'status',使⽤认证连接访问则显⽰全部信息详情)falseinfo显⽰任意的应⽤信息falsemetrics展⽰当前应⽤的'指标'信息truemappings显⽰⼀个所有@RequestMapping路径的整理列表trueshutdown允许应⽤以优雅的⽅式关闭(默认情况下不启⽤)truetrace显⽰trace信息(默认为最新的⼀些HTTP请求)true总结以上所述是⼩编给⼤家介绍的SpringBoot 监控管理模块actuator没有权限的问题解决⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

Springboot+SpringSecurity实现前后端分离登录认证及权限控制

Springboot+SpringSecurity实现前后端分离登录认证及权限控制

Springboot+SpringSecurity实现前后端分离登录认证及权限控制Springboot + Spring Security 实现前后端分离登录认证及权限控制前⾔本⽂主要的功能⽂章⽬录⽂章正⽂⼀、准备⼯作1、统⼀错误码枚举2、统⼀json返回体3、返回体构造⼯具4、pom5、配置⽂件⼆、数据库表设计建表语句初始化表数据语句三、Spring Security核⼼配置:WebSecurityConfig四、⽤户登录认证逻辑:UserDetailsService1、创建⾃定义UserDetailsService2、准备service和dao层⽅法(1)根据⽤户名查询⽤户信息(2)根据⽤户名查询⽤户的权限信息五、⽤户密码加密六、屏蔽Spring Security默认重定向登录页⾯以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑(1)登录成功(2)登录失败(3)登出2、在WebSecurityConfig中的configure(HttpSecurity http)⽅法中声明⼋、会话管理(登录过时、限制单⽤户或多⽤户登录等)1、限制登录⽤户数量2、处理账号被挤下线处理逻辑3、在WebSecurityConfig中声明九、实现基于JDBC的动态权限控制1、权限拦截器2、安全元数据源FilterInvocationSecurityMetadataSource3、访问决策管理器AccessDecisionManager4、在WebSecurityConfig中声明⼗、最终的WebSecurityConfig配置⼗⼀、结束语原⽂中数据库更正如下:1 DROP TABLE IF EXISTS `sys_user`;2 create table sys_user3 (4 id int auto_increment5 primary key,6 account varchar(32) not null comment '账号',7 user_name varchar(32) not null comment '⽤户名',8 password varchar(64) null comment '⽤户密码',9 last_login_time datetime null comment '上⼀次登录时间',10 enabled tinyint(1) default1null comment '账号是否可⽤。

springsecurity原理

springsecurity原理

springsecurity原理Spring Security是一个基于Java的用于身份验证和授权的安全框架。

它提供了一系列功能和API,帮助开发者实现系统的安全性。

Spring Security的主要原理可以总结为以下几个方面:1. 过滤器链:Spring Security使用过滤器链来拦截所有的HTTP请求并进行安全验证。

每个请求都会经过多个过滤器,在每个过滤器中执行具体的身份验证和授权逻辑。

2. 用户认证:Spring Security提供了多种用户认证的方式,包括基于数据库、LDAP、内存等的认证方式。

开发者可以选择合适的认证方式来验证用户的身份。

认证成功后,认证信息会被保存在SecurityContext中,方便后续的授权操作。

3. 授权策略:Spring Security定义了授权策略来决定系统中不同角色用户的访问权限。

通过配置角色和权限的关系,可以实现对系统资源的精确控制。

开发者可以使用注解或者配置的方式定义授权策略。

4. 安全配置:Spring Security通过一系列的配置来控制系统的安全性。

开发者可以通过配置文件或者编程的方式定义安全规则,包括URL的保护、登录页面的定制、角色和权限的管理等。

5. 常见攻击防护:Spring Security内置了对常见攻击的防护机制,包括跨站点请求伪造(CSRF)、跨站脚本攻击(XSS)、点击劫持等。

开发者可以很方便地使用Spring Security提供的功能来保护应用程序免受这些攻击。

总之,Spring Security通过过滤器链、用户认证、授权策略、安全配置和攻击防护等机制,实现了对系统的身份认证和访问控制,提供了一种简单而灵活的方式来保护应用程序的安全性。

4、Spring Security 安全权限管理手册

4、Spring Security 安全权限管理手册

Spring Security 3.0 安全权限管理手册参考文献:1、中的spring security权限管理手册。

2、spring security3.0权限管理手册3、spring的相关资料。

本文档内容仅仅作为公司权限管理资料用,对于企业来说,权限管理将是系统中的非常重要的一个模块,权限的设计也是参考相关资料进行整理和补充。

系统将通过数据库进行管理用户权限。

权限管理搭建要的问题:1、区分Authentication(验证)与 Authorization(授权)验证这个用户是谁?用户身份可靠吗?授权某用户A是否可以访问资源R某用户A是否可以执行M操作某用户A是否可以对资源R执行M操作2、SS中的验证特点支持多种验证方式支持多种加密格式支持组件的扩展和替换可以本地化输出信息3、SS中的授权特点支持多种仲裁方式支持组件的扩展和替换支持对页面访问、方法访问、对象访问的授权。

4、SS核心安全实现Web安全通过配置Servlet Filter激活SS中的过滤器链实现Session一致性验证实现免登陆验证(Remember-Me验证)提供一系列标签库进行页面元素的安全控制方法安全通过AOP模式实现安全代理Web安全与方法安全均可以使用表达式语言定义访问规则5、配置SS配置Web.xml,应用安全过滤器配置Spring,验证与授权部分在web页面中获取用户身份在web页面中应用安全标签库实现方法级安全6、配置web.xml7、Spring配置文件中设置命名空间8、通过数据库验证用户身份9、完善web页面验证规则10、自定义验证配置11、本地化消息输出(国际化)根据公司项目的开发要求和集合spring security3.0功能,公司将通过数据库进行对用户身份验证和授权,系统将建立5个基础表进行对权利的管理。

第一部分数据库设计1、表设计create table pub_users(user_id varchar(32),user_account varchar(30),user_name varchar(40),user_password varchar(100),user_desc varchar(100),enabled int,issys int);alter table pub_users add constraint pk_pub_users primary key(user_id);create table pub_authorities(authority_id varchar(32),authority_name varchar(40),authority_desc varchar(100),enabled int,issys int);alter table pub_authorities add constraint pk_pub_authorities primary key(authority_id);create table pub_roles(role_id varchar(32),role_name varchar(40),role_desc varchar(100),enabled int,issys int);alter table pub_roles add constraint pk_pub_roles primary key(role_id);create table pub_resources(resource_id varchar(32),resource_name varchar(100),resource_desc varchar(100),resource_type varchar(40),resource_string varchar(200),priority int,enabled int,issys int);alter table pub_resources add constraint pk_pub_resources primary key(resource_id);create table pub_users_roles(id numeric(12,0) IDENTITY NOT NULL,user_id varchar(32),role_id varchar(32),enabled int);alter table pub_users_roles add constraint pk_pub_users_roles primary key(id); alter table pub_users_roles add constraint fk_users_roles_users foreign key(user_id) references pub_users(user_id);alter table pub_users_roles add constraint fk_users_roles_roles foreign key(role_id) references pub_roles(role_id);create table pub_roles_authorities(id numeric(12,0) IDENTITY NOT NULL,role_id varchar(32),authority_id varchar(32),enabled int);alter table pub_roles_authorities add constraint pk_pub_roles_authorities primary key(id);alter table pub_roles_authorities add constraint fk_pub_roles_authorities_authorities foreign key(authority_id) references pub_authorities(authority_id);alter table pub_roles_authorities add constraint fk_pub_roles_authorities_roles foreign key(role_id) references pub_roles(role_id);create table pub_authorities_resources(id numeric(12,0) IDENTITY NOT NULL,authority_id varchar(32),resource_id varchar(32),enabled int);alter table pub_authorities_resources add constraint pk_pub_authorities_resources primary key(id);alter table pub_authorities_resources add constraint fk_pub_authorities_resources_authorities foreign key(authority_id) references pub_authorities(authority_id);alter table pub_authorities_resources add constraint fk_pub_authorities_resources_resources foreign key(resource_id) references pub_resources(resource_id);3、E-R图如下:第二部分 WEB数据库整合提示:相关代码请参考项目模块1、将数据库表结构和Hibernate建立映射,本系统采用annotation进行对数据库进行零配置处理(请参考hibernate映射),如图。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Spring安全权限管理(SpringSecurity)收藏1.Spring Security简要介绍Spring Security以前叫做acegi,是后来才成为Spring的一个子项目,也是目前最为流行的一个安全权限管理框架,它与Spring紧密结合在一起。

Spring Security关注的重点是在企业应用安全层为您提供服务,你将发现业务问题领域存在着各式各样的需求。

银行系统跟电子商务应用就有很大的不同。

电子商务系统与企业销售自动化工具又有很大不同。

这些客户化需求让应用安全显得有趣,富有挑战性而且物有所值。

Spring Security为基于J2EE的企业应用软件提供了一套全面的安全解决方案。

2.为Spring Security配置过滤器和其他参数要使用Spring Security,首先就是在web.xml中为它配置过滤器,其次因为我的spring配置文件是放在WEB-INF下的,因此还要配置上下文的参数,最后添加spring的监听器:1.<?xml version="1.0"encoding="UTF-8"?>2.<web-app version="2.5"xmlns="/xml/ns/javaee"3.xmlns:xsi="/2001/XMLSchema-instance"4.xsi:schemaLocation="/xml/ns/javaee http://jav/xml/ns/javaee/web-app_2_5.xsd">5.<!-- 配置上下文参数,指定spring配置文件的位置 -->6.<context-param>7.<param-name>contextConfigLocation</param-name>8.<param-value>/WEB-INF/spring-*.xml</param-value>9.</context-param>10.<!-- spring security必须的过滤器,保证在访问所有的页面时都必须通过认证 -->11.<filter>12.<filter-name>springSecurityFilterChain</filter-name>13.<filter-class>14. org.springframework.web.filter.DelegatingFilterProxy15.</filter-class>16.</filter>17.<filter-mapping>18.<filter-name>springSecurityFilterChain</filter-name>19.<url-pattern>/*</url-pattern>20.</filter-mapping>21.<listener>22.<listener-class>23. org.springframework.web.context.ContextLoaderListener24.</listener-class>25.</listener>26.<welcome-file-list>27.<welcome-file>index.jsp</welcome-file>28.</welcome-file-list>29.<login-config>30.<auth-method>BASIC</auth-method>31.</login-config>32.</web-app>3.配置security(spring-security.xml)1.<?xml version="1.0"encoding="UTF-8"?>2.<!-- 这里必须使用security的命名空间,提供了beans这个假名 -->3.<beans:beans xmlns="/schema/security"4.xmlns:beans="/schema/beans"5.xmlns:xsi="/2001/XMLSchema-instance"6.xsi:schemaLocation="/schema/beans http:///schema/beans/spring-beans-2.0.xsd7. /schema/security/schema/security/spring-security-2.0.4.xsd">8.9.<!-- Spring Security采用就近原则,有多个约束时,从上至下只要找到第一条满足就返回,因此因该将最严格的约束放在最前面,而将最宽松的约束放在最后面.auto-config属性可以让spring security为我们自动配置几种常用的权限控制机制,包括form,anonymous, rememberMe等。

当然你也可以手工配置。

-->10.<http auto-config="true">11.<!-- 我们利用intercept-url来判断用户需要具有何种权限才能访问对应的url资源,可以在pattern中指定一个特定的url资源,也可以使用通配符指定一组类似的url资源。

例子中定义的两个intercepter-url,第一个用来控制对/security/**的访问,第二个使用了通配符/**,说明它将控制对系统中所有url资源的访问。

-->12.<intercept-url pattern="/security/**"access="ROLE_ADMIN"/>13.<intercept-url pattern="/**"access="ROLE_ADMIN,ROLE_USER"/>14.<intercept-url pattern="/login.jsp*"filters="none"/>15.<logout logout-url="/logout.jsp"16.logout-success-url="/j_spring_security_check"/>17.</http>18.19. <!-- 使用内存权限管理的配置信息, 在tomcat启动时,会加载这个文件并一直保存在内存中,知道应用程序重启,所以也叫内存权限管理20.<authentication-provider>21.<user-service>22.<user name="admin"password="tomcat"authorities="ROLE_ADMIN"/>23.<user name="liky"password="redhat"authorities="ROLE_USER"/>24.</user-service>25.</authentication-provider>26. -->27.<!-- 使用数据库作为权限管理的来源,data-source-ref指定了数据源,所指定的数据源必须包含users, authorities表,并符合security的定义规范 -->28.<authentication-provider>29.<jdbc-user-service data-source-ref="dataSource"/>30.</authentication-provider>31.32.</beans:beans>4.数据源的配置(spring-common.xml)1.<?xml version="1.0" encoding="UTF-8"?>2.<beans xmlns="/schema/beans"3. xmlns:xsi="/2001/XMLSchema-instance"4. xsi:schemaLocation="/schema/beans http:///schema/beans/spring-beans-2.5.xsd"> 5.6. <!-- 定义数据源 -->7. <bean id="dataSource"8.class="mons.dbcp.BasicDataSource">9. <property name="driverClassName"10. value="com.mysql.jdbc.Driver">11. </property>12. <property name="url" value="jdbc:mysql://localhost:3306/csu"></property>13. <property name="username" value="root"></property>14. <property name="password" value="redhat"></property>15. <property name="maxActive" value="100"></property>16. <property name="maxIdle" value="30"></property>17. <property name="maxWait" value="300"></property>18. <property name="defaultAutoCommit" value="true"></property>19. </bean>20.</beans>5.项目的目录结构6. 数据库脚本1./-- 注意这里的脚本是MYSQL的,因此在你演示这个实例的时候,要加入MySQL的驱动包 --/2.3.create table users4.(ername varchar(50) primary key,6.password varchar(50),7.enabled tinyint(1)8.);9.10.create table authorities11.(12.id int auto_increment primary key,ername varchar(50),14.authority varchar(50),15.constraint fk_authorities_users foreign key(username) references users(username)16.);17.18.create unique index ix_auth_username on authorities (username,authority);7.部署和配置的要点说明这是一个Spring Security的数据库认证实例,要注意以下几点:(1)请自行加入Spring必须的包,Spring security的包和MySQL的驱动包,当然你也可以换成其他的数据库,但是你要相应的修改spring-common.xml中的dataSource部分(2)数据库中的两个表users,authorites必须完全按照脚本所示来定义,也就是说表的名字不能修改.(3)users表必须包含username,password,enabled字段,这三个字段是绝对不能少的,也不能修改类型.另外enabled一定要为1才能登录(4)authorities表必须包含username字段,这个字段引用users的username作为外键,authority字段就是角色的名字,角色名字必须满足ROLE_XXX的格式(例如:ROLE_ADMIN,ROLE_USER,ROLE_MAMAGER)(5)如果一个用户有多个角色,不要将多个角色放在一起用逗号隔开.而是每个角色定义一条记录(例如:abu有ROLE_ADMIN,ROLE_USER 两个角色,那么应该定义两条记录: 一条为abu, ROLE_USER,另一条为abu, ROLE_ADMIN.而不是只有一条:abu, ROLE_ADMIN,ROLE_USER) (6)你可以给authorities表添加一个id字段作为主键.。

相关文档
最新文档