Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

学习springBoot(11)shiro安全框架

$
0
0

今天研究一下 常用的安全框架shiro

先好好研究一下shiro 的首先原理,方便后面的学习 shiro (java安全框架) Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以 快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 软件名称 Apache Shiro 开发商 Apache 性质 Java安全框架 复制代码 主要功能 三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户 (Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为 是Shiro的“用户”概念。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来 提供安全管理的各种服务。 Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控 制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。从这个意义上讲,Realm实质上是一个安全相关的DAO:它 封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和( 或)授权。配置多个Realm是可以的,但是至少需要一个。Shiro内置了可以连接大量安全数据源(又名目录)的Realm, 如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表 自定义数据源的自己的Realm实现。 复制代码
学习springBoot(11)shiro安全框架
学习springBoot(11)shiro安全框架
学习springBoot(11)shiro安全框架
学习springBoot(11)shiro安全框架
shiro 原理剖析: shiro的核心是java servlet规范中的filter,通过配置拦截器,使用拦截器链来拦截请求,如果允许访问,则通过。通常情况下,系统的登录、退出会配置拦截器。登录的时候,调用subject.login(token),token是用户验证信息,这个时候会在Realm中doGetAuthenticationInfo方法中进行认证。这个时候会把用户提交的验证信息与数据库中存储的认证信息进行比较,一致则允许访问,并在浏览器种下此次回话的cookie,在服务器端存储session信息。退出的时候,调用subject.logout(),会清除回话信息。

shiro中核心概念介绍: Filter:

1.AnonymousFilter:通过此filter修饰的url,任何人都可以进行访问,即使没有进行权限认证

2.FormAuthenticationFilter:通过此filter修饰的url,会对请求的url进行验证,如果没有通过,则会重定向返回到loginurl

3.BasicHttpAuthenticationFilter:通过此filter修饰的url,要求用户已经通过认证,如果没有通过,则会要求通过Authorization 信息进行认证

4.LogoutFilter:通过此filter修饰的url,一旦收到url请求,则会立即调用subject进行退出,并重定向到redirectUrl

5.NoSessionCreationFilter:通过此filter修饰的url,不会创建任何会话

6.PermissionAuthorizationFilter:权限拦截器,验证用户是否具有相关权限

7.PortFilter:端口拦截器,不是通过制定端口访问url,将自动将端口重定向到指定端口

8.HttpMethodPermissionFilter:rest风格拦截器,配置rest的访问方式

9.RolesAuthorizationFilter:角色拦截器,未登陆,将跳转到loginurl,未授权,将跳转到unauthorizedUrl

10.SslFilter:HTTPS拦截器,需要以HTTPS的方式进行访问

11.UserFilter:用户拦截器,需要用户已经认证,或已经remember me

拦截配置说明: anon:例子/admins/**=anon 没有参数,表示可以匿名使用。 authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数 roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。 perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。 rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。 port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。 authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证 ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查 注:anon,authcBasic,auchc,user是认证过滤器, perms,roles,ssl,rest,port是授权过滤器 复制代码 shiro 的权限控制只是做到资源的权限控制,要想实现业务数据的权限控制,肯定是需要耦合到我们具体的业务代码里面的,后面有时间在分享一下现在自己公司的一种解决思路。

上面简单介绍了一下shiro,接下来就进入正题。

加入需要的依赖

<!-- spring-data-jpa --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--模板引擎,访问静态资源--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- shiro 相关包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.4.0</version> </dependency> <!-- shiro+redis缓存插件 --> <dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>2.4.2.1-RELEASE</version> </dependency> <!--shiro与thymelef的集成插件--> <dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>2.0.0</version> </dependency> 复制代码

yml文件在加入一点配置,这里要注意的是jpa 和之前的datasource 处于同一级

#通过jpa 生成数据库表 spring: jpa: hibernate: ddl-auto: update show-sql: true thymeleaf: cache: false prefix: classpath:/templates/ suffix: .html encoding: UTF-8 content-type: text/html mode: html5 复制代码

数据库设计 一般的权限管理都会设计到这五张表(用户表、角色表、用户角色中间表、权限表、角色权限中间表)

1、用户表:

@Entity //实体类的注解 @Table(name="sys_user") public class SysUser implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String userName; private String passWord; private int userEnable; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public int getUserEnable() { return userEnable; } public void setUserEnable(int userEnable) { this.userEnable = userEnable; } } 复制代码

2、角色表

@Entity //实体类的注解 @Table(name="sys_role") public class SysRole implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String roleName; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } } 复制代码

3、用户角色中间表

@Entity //实体类的注解 @Table(name="sys_user_role") public class SysUserRole implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private int userId; private int roleId; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getRoleId() { return roleId; } public void setRoleId(int roleId) { this.roleId = roleId; } } 复制代码

4、权限表

@Entity //实体类的注解 @Table(name="sys_permission") public class SysPermission implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private

Viewing all articles
Browse latest Browse all 12749

Latest Images

Trending Articles





Latest Images