权限管理和Shiro

1.权限管理

1.1什么是权限管理

基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

1.2.什么是身份认证

 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。

 1.3.什么是授权

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的

 

如果自己完成认证和授权相对来说比较麻烦。可以使用第三方框架帮你完成认证和权限的绑定。

使用比较多的第三方框架---shirospringsecurity安全框架。shiro使用比较简单。而且它可以单独使用也可以和spring框架整合。

 2.什么是shiro

Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.

注解:

Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务。并且相对于其他安全框架spring security,Shiro 要简单的多.

Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。

 2.1为什么学习shiro----简单,安全

Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。

 2.2shiro的核心组件

 1)Subject

Subject主体,外部应用与subject进行交互,subject将用户作为当前操作的主体,这个主体:可以是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权

 2)SecurityManager

SecurityManager权限管理器,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口

 3)Authenticator

Authenticator即认证器,对用户登录时进行身份认证

 4)Authorizer

Authorizer授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

 5)Realm(数据库读取 + 认证功能 + 授权功能实现)

 

Realm领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据
比如:
	如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。
注意:
	不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

 6)SessionManager

SessionManager会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

 7)SessionDAO

SessionDAO即会话dao,是对session会话操作的一套接口
比如:
	可以通过jdbc将会话存储到数据库
	也可以把session存储到缓存服务器redis

 8)CacheManager

CacheManager缓存管理,将用户权限数据存储在缓存,这样可以提高性能

 9)Cryptogeaphy9)

Cryptography密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、md5等功能

 2.3使用shiro完成认证 ini

用户的信息存在--ini文件【实际开发存储数据库】

 1)创建java的maven工程并引入shiro依赖

<dependencies>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.7.0</version>
        </dependency>
    </dependencies>

2)创建一个 ini 文件

安装一个注释插件

 

# [users]定义用户的信息--当对于表名叫users
[users]
# =左边表示用户名  =右边表示密码
zhangsan=123456
lisi=123456

 3)编写代码

package demo01;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
public class Test01 {
    public static void main(String[] args) {
        //创建一个SecurityManager对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        //设置securityManager使用的realm
        IniRealm realm=new IniRealm("classpath:shiro.ini");
        securityManager.setRealm(realm);
        //把SecurityManager放入上下文中,使其有效
        SecurityUtils.setSecurityManager(securityManager);
        //获取Subject对象
        Subject subject = SecurityUtils.getSubject();
        //shiro把用户输入的账号和密码封装到UsernamePasswordToken类中
        UsernamePasswordToken token = new UsernamePasswordToken("hmq", "12345");
        try{
            //调用subject中的认证方法
            subject.login(token);
            System.out.println("登录成功");
        }catch (Exception e ){
            e.printStackTrace();
            System.out.println("登录失败");
        }
    }
}

流程图:

 

 2.4使用shiro完成授权功能--ini

一定是认证后才能对权限判断

 1)修改ini 文件

# [users]定义用户的信息--当对于表名叫users
[users]
# =左边表示用户名  =右边表示密码和对应的角色
zhangsan=123456,admin
lisi=123456,role1,role2
#[roles]定义角色信息以及该角色具有的权限信息。
[roles]
#=左边:角色名  右边: 该角色具有的权限
admin=user:query,user:insert,user:delete,user:update
role1=user:query,user:export
role2=user:delete,user:update

2)修改代码

package demo01;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import java.util.Arrays;
public class Test02 {
    public static void main(String[] args) {
        //1.获取SecurityManager对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        //2.为SecurityManager指定操作数据源的对象realm
        IniRealm realm = new IniRealm("classpath:shiro.ini");
        securityManager.setRealm(realm);
        //3.把securityManager放入上下文 使其生效
        SecurityUtils.setSecurityManager(securityManager);
        //4.获取Subject
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("hmq", "12345");
        try{
            subject.login(token);
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("登录失败");
        }
        //subject.logout();//退出
        System.out.println("----------------权限校验-------------");
        boolean permitted = subject.isPermitted("user:query");
        System.out.println("判断当前用户是否具有user:query的权限:"+permitted);
        boolean[] permitted1 = subject.isPermitted("user:query", "user:delete", "user:export");
        System.out.println("判断当前用户具有的权限:"+ Arrays.toString(permitted1));
        boolean[] permitted2 = subject.isPermitted("user:query", "user:update", "user:insert");
        System.out.println("是否同时具有上面的权限:"+permitted2);
    }
}

流程图:

 

 2.5使用shiro完成认证--数据源

上面通过读取ini文件,可以获取数据源。IniRealm完成的读取,现在如果读取数据源的数据完成认证,则需要自定义realm类

 1)新建一个maven工程,导入pom配置文件

<dependencies>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.28</version>
    </dependency>
</dependencies>

2)创建一个MyRealm类并继承AuthorizingRealm

package demo01;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import java.util.List;

public class MyRealm extends AuthorizingRealm {//重写方法
    private UserService userService = new UserService();
    //完成授权的业务
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("授权执行该方法+++++++++++++++++");
        return null;
    }
    //完成认证的功能
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("认证执行该方法!!!!!!!!!!!!!!!!");
        //获取当前登录的账号
        String username = authenticationToken.getPrincipal().toString();
        /*System.out.println("-------------输入账号:"+username);*/
        //根据账号查询数据库中是否存在对应的记录
        User user = userService.findByUsername(username);
        if (user!=null){
            //Object principal  ,账号
            //Object credentials,密码--从数据中查询到该用户密码
            //String realmName;realm的名称----自己定义---内置一个方法 getName
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, user.getPassword(), this.getName());
            return info;
        }
        return null;
    }
}

3)创建user实体类

package demo01;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String nickName;//昵称
}

4)创建UserService

package demo01;
import java.util.ArrayList;
import java.util.List;
public class UserService {
    public User findByUsername(String username) {
        if ("admin".equals(username)){
            return new User(1,"admin","12345","超级管理员");
        }else if ("ybn".equals(username)){
            return new User(2,"ybn","12345","我的仆人");
        }else if ("hmq".equals(username)){
            return new User(3,"hmq","12345","霍梦齐");
        }
        return null;
    }
}

5)修改测试类

 2.6使用shiro完成授权---数据源

1)在myRealm中增加权限方法的编写

//完成授权的业务
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    System.out.println("授权执行该方法+++++++++++++++++");
    //获取当前用户具有的权限---shiro帮你把全线封装起来
    String username = principalCollection.getPrimaryPrincipal().toString();
    //System.out.println(principalCollection.getPrimaryPrincipal()+"-------------");
    //根据用户查询该用户具有的权限
    List<String> permissions = userService.findPermissionByUsername(username);
    if (permissions.size()!=0){
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addStringPermissions(permissions);
        return info;
    }
    return null;
}

2)编辑UserService代码---根据用户查询对应的权限

public List<String> findPermissionByUsername(String username) {
    List<String> list = new ArrayList<String>();
    if ("admin".equals(username)){
        list.add("user:query");
        list.add("user:delete");
        list.add("user:update");
        list.add("user:insert");
    }else if ("ybn".equals(username)){
        list.add("user:query");
        list.add("user:export");
    }else if ("hmq".equals(username)){
        list.add("user:query");
        list.add("user:delete");
        list.add("user:update");
    }
    return list;
}

 3)修改测试类

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 是一个非常流行的 Java 开发框架,而 Shiro 则是一个轻量级的身份验证和授权框架。使用 Spring Boot 和 Shiro 结合起来进行权限管理,可以非常方便地实现用户登录、权限验证等功能。 具体来说,我们可以通过在 Spring Boot 中配置 Shiro,来实现基于角色或权限的访问控制。通过使用 Shiro 提供的 Subject、Realm 等核心组件,我们可以轻松地完成用户身份认证、权限验证等操作。此外,Shiro 还提供了诸如密码加密、会话管理等功能,可以帮助我们更好地保护应用程序的安全性。 总的来说,结合 Spring Boot 和 Shiro 进行权限管理可以让我们更快速、更安全地开发应用程序。 ### 回答2: Spring Boot 是一种基于 Spring 框架的、用于快速构建应用程序的微服务框架,它可以轻松集成第三方组件,并且提供了一些便利的注解,让开发者可以更加专注于业务逻辑的实现。 而 Shiro 则是一种强大的 Java 安全框架,提供了身份验证、授权、加密等安全功能。Shiro 可以轻松地与 Spring Boot 进行集成,实现 permission-based access control(基于权限的访问控制),这意味着用户必须拥有特定的权限才能访问某些特定的资源。下面我们将详细讨论如何在 Spring Boot 中使用 Shiro 实现权限管理。 1. 添加 Shiro 依赖 首先需要在 Spring Boot 项目中添加 Shiro 的依赖。在 Maven 中,您需要将以下依赖添加到您的 pom.xml 文件中: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.2</version> </dependency> ``` 2. 配置 Shiro 在 Spring Boot 应用程序中,需要创建一个 ShiroFilterFactoryBean 和一个 SecurityManager bean。在 Shiro 过滤器工厂中,您需要指定访问控制规则以及 URL 的映射。这个过程可以通过编写 Shiro 配置文件来完成。下面是一个配置文件的示例。 ``` # shiro.ini [users] # 用户名 = 密码,角色1,角色2,角色3 admin = password, admin user = password, user [roles] # 角色定义 admin = * user = user:read [urls] # url 映射到角色 /login = anon /logout = logout /user/** = user /admin/** = admin ``` 3. 创建控制器 通过将 Shiro 的注解添加到控制器方法中,实现基于角色的访问控制。下面是一个示例控制器: ``` import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class UserController { @GetMapping("/user") public String user(Model model) { Subject subject = SecurityUtils.getSubject(); model.addAttribute("user", subject.getPrincipal()); return "user"; } @GetMapping("/admin") public String admin(Model model) { Subject subject = SecurityUtils.getSubject(); model.addAttribute("user", subject.getPrincipal()); return "admin"; } } ``` 在上面的示例中,user 和 admin 控制器方法都是基于角色进行访问控制。只有角色为 user 的用户才能访问 /user 路径,而只有角色为 admin 的用户才能访问 /admin 路径。 4. 创建登录页面 用户需要先登录才能访问有限资源。当用户访问有限资源时,Shiro 触发登录请求并将用户重定向到登录页面。下面是一个示例的登录页面。 ``` <form action="/login" method="POST"> <input type="text" name="username" placeholder="Username" required /> <input type="password" name="password" placeholder="Password" required /> <button type="submit">Login</button> </form> ``` 上面的登录表单将用户名和密码提交到 /login 接口,接口用于验证用户凭证及权限,并且在成功验证后重定向用户到其一开始请求的资源。若没有授权,则会将用户重定向到未授权的页面。 5. 对密码进行加密 在生产环境中,密码必须加密,以避免用户数据泄漏问题。下面是使用 Shiro 进行密码加密的示例代码: ``` import org.apache.shiro.crypto.hash.Md5Hash; import org.apache.shiro.crypto.hash.Sha256Hash; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.util.ByteSource; public class PasswordUtil { public static String md5(String password, String salt) { return new Md5Hash(password, ByteSource.Util.bytes(salt), 2).toHex(); } public static String sha256(String password, String salt) { return new Sha256Hash(password, ByteSource.Util.bytes(salt), 1024).toHex(); } public static String simpleHash(String password, String salt) { return new SimpleHash("SHA-3-256", password, ByteSource.Util.bytes(salt), 1024).toString(); } } ``` 在上面的示例中,我们使用了三种不同类型的散列算法——MD5、SHA256 和 SHA-3-256。Shiro 使用 ByteSource 工具类来指明盐值。 在总结一下,Spring Boot 和 Shiro 的结合可以帮助我们快速构建一个安全可靠的 Web 应用程序,并且通过角色授权方式,可以防止非授权访问尝试。以上就是采用 Spring Boot 和 Shiro 实现权限管理的基本介绍。 ### 回答3: SpringBoot是一个用于创建基于Spring框架的Java应用程序的工具,它可以让开发人员更轻松地快速创建应用程序。而Shiro是一个强大而灵活的用于认证,授权和会话管理的Java框架。在SpringBoot中集成Shiro可以非常方便地完成权限管理Shiro具有许多功能,其中包括身份验证(Authentication)和授权(Authorization),这意味着Shiro可以处理登录和控制用户访问资源。Shiro还支持会话管理,在Web应用程序中可以使用Shiro管理会话,防止会话劫持和防止跨站点脚本攻击。Shiro的另一个优点是可以对加密和散列数据进行简单但强大的支持。此外,使用Shiro可以实现单点登录(Single sign-on,简称SSO),这对企业应用程序非常重要。 在SpringBoot中,集成Shiro非常容易。我们只需要在pom.xml中添加相应的依赖,然后在配置文件中设置Shiro的相关配置即可。配置Shiro认证和授权的最佳实践是将其分开,这样我们可以将认证设置单独控制,并在需要时轻松地将授权设置组合起来。如果我们需要更多的功能,Shiro通常提供了许多可插拔的组件和扩展。 在权限管理方面,Shiro非常适合企业应用程序,可以使用Shiro控制用户对资源的访问权限。我们可以为每个用户或角色设置权限,这就意味着我们可以非常细致地控制资源的访问权限Shiro提供了各种各样的过滤器,我们可以使用这些过滤器在开发应用程序时精确地控制哪些用户可以访问哪些资源。 总之,SpringBoot和Shiro的集成可以帮助开发人员快速而轻松地构建功能强大的企业应用程序,实现身份验证,授权和会话管理等功能。Shiro权限管理功能使得我们可以非常精确地控制用户对资源的访问权限,从而满足企业应用程序的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值