Springboot-Shiro基本使用详情介绍

Spring Boot Shiro 基本使用

Apache Shiro 是一个强大且易于使用的Java安全框架,提供了身份验证、授权、加密和会话管理等功能。在Spring Boot应用程序中使用Shiro可以轻松地实现安全性。

本文将介绍如何在Spring Boot应用程序中使用Shiro进行身份验证和授权。

步骤

以下是使用Spring Boot Shiro进行身份验证和授权的步骤:

  1. 添加Shiro依赖项

在pom.xml文件中添加以下依赖项:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.7.1</version>
</dependency>
  1. 配置Shiro

在application.properties文件中添加以下配置:

# Shiro配置
shiro:
  # 登录URL
  loginUrl: /login
  # 登录成功URL
  successUrl: /index
  # 未授权URL
  unauthorizedUrl: /unauthorized
  # Shiro过滤器链配置
  filterChainDefinitions: /static/** = anon\n/login = anon\n/logout = logout\n/** = authc

在上面的示例中,我们配置了Shiro的登录URL、登录成功URL、未授权URL和过滤器链。我们使用filterChainDefinitions属性来指定URL模式和相应的过滤器。

  1. 创建ShiroRealm

创建一个名为ShiroRealm的Java类,用于实现Shiro的Realm接口。以下是示例代码:

@Component
public class ShiroRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        User user = (User) principals.getPrimaryPrincipal();
        authorizationInfo.setRoles(userService.getRoles(user.getUsername()));
        authorizationInfo.setStringPermissions(userService.getPermissions(user.getUsername()));
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
    }
}

在上面的示例中,我们创建了一个名为ShiroRealm的类,用于实现Shiro的Realm接口。我们使用@Component注解将该类标记为Spring组件。我们使用@Autowired注解注入UserService。我们实现了doGetAuthorizationInfo和doGetAuthenticationInfo方法,用于授权和身份验证。在doGetAuthorizationInfo方法中,我们获取用户的角色和权限,并将它们设置为授权信息。在doGetAuthenticationInfo方法中,我们获取用户名和密码,并将它们设置为身份验证信息。

  1. 创建ShiroFilter

创建一个名为ShiroFilter的Java类,用于实现Shiro的Filter接口。以下是示例代码:

@Component
public class ShiroFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        SecurityUtils.setSecurityManager(SecurityUtils.getSecurityManager());
        Subject subject = SecurityUtils.getSubject();
        if (!subject.isAuthenticated() && !subject.isRemembered()) {
            WebUtils.issueRedirect(request, response, "/login");
            return;
        }
        filterChain.doFilter(request, response);
    }
}

在上面的示例中,我们创建了一个名为ShiroFilter的类,用于实现Shiro的Filter接口。我们使用@Component注解将该类标记为Spring组件。我们实现了doFilterInternal方法,用于处理HTTP请求。在该方法中,我们获取当前用户的主题,并检查用户是否已经通过身份验证或记住我。如果用户未通过身份验证或记住我,则将用户重定向到登录页面。

  1. 创建登录页面

创建一个名为login.html的HTML文件,用于显示登录页面。以下是示例代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="post" action="/login">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
        <br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
        <br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

在上面的示例中,我们创建了一个名为login.html的HTML文件,用于显示登录页面。我们使用form元素创建一个登录表单,其中包含用户名和密码字段。

  1. 创建授权页面

创建一个名为index.html的HTML文件,用于显示授权页面。以下是示例代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <h1>Index</h1>
    <p>Welcome, ${user.username}!</p>
    <p>Your roles are: ${user.roles}</p>
    <p>Your permissions are: ${user.permissions}</p>
    <a href="/logout">Logout</a>
</body>
</html>

在上面的示例中,我们创建了一个名为index.html的HTML文件,用于显示授权页面。我们使用${user.username}、${user.roles}和${user.permissions}表达式显示当前用户的用户名、角色和权限。我们使用元素创建一个注销链接。

  1. 创建未授权页面

创建一个名为unauthorized.html的HTML文件,用于显示未授权页面。以下是示例代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Unauthorized</title>
</head>
<body>
    <h1>Unauthorized</h1>
    <p>You are not authorized to access this page.</p>
    <a href="/login">Login</a>
</body>
</html>

在上面的示例中,我们创建了一个名为unauthorized.html的HTML文件,用于显示未授权页面。我们使用

元素显示未授权消息。我们使用元素创建一个登录链接。

  1. 创建UserController

创建一个名为UserController的Java类,用于处理HTTP请求。以下是示例代码:

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/index")
    public ModelAndView index(Principal principal) {
        ModelAndView modelAndView = new ModelAndView("index");
        User user = userService.getUserByUsername(principal.getName());
        modelAndView.addObject("user", user);
        return modelAndView;
    }

    @GetMapping("/unauthorized")
    public String unauthorized() {
        return "unauthorized";
    }
}

在上面的示例中,我们创建了一个名为UserController的类,用于处理HTTP请求。我们使用@RestController注解将该类标记为Spring MVC控制器。我们使用@Autowired注解注入UserService。我们实现了index和unauthorized方法,用于显示授权和未授权页面。在index方法中,我们获取当前用户的用户名,并将其传递给UserService以获取用户信息。我们使用ModelAndView对象返回index.html视图,并将用户信息添加到模型中。

  1. 创建UserService

创建一个名为UserService的Java类,用于提供用户信息。以下是示例代码:

@Service
public class UserService {
    private Map<String, User> users = new HashMap<>();

    public UserService() {
        User user1 = new User("admin", "admin", "admin");
        user1.setRoles(Arrays.asList("admin"));
        user1.setPermissions(Arrays.asList("user:list", "user:add", "user:edit", "user:delete"));
        users.put(user1.getUsername(), user1);

        User user2 = new User("user", "user", "user");
        user2.setRoles(Arrays.asList("user"));
        user2.setPermissions(Arrays.asList("user:list"));
        users.put(user2.getUsername(), user2);
    }

    public User getUserByUsername(String username) {
        return users.get(username);
    }

    public List<String> getRoles(String username) {
        User user = getUserByUsername(username);
        return user.getRoles();
    }

    public List<String> getPermissions(String username) {
        User user = getUserByUsername(username);
        return user.getPermissions();
    }
}

在上面的示例中,我们创建了一个名为UserService的类,用于提供用户信息。我们使用@Service注解将该类标记为Spring服务。我们使用Map存储用户信息。我们在构造函数中添加了两个用户。我们实现了getUserByUsername、getRoles和getPermissions方法,用于获取用户信息、角色和权限。

示例

以下是两个示例,演示如何使用Spring Boot Shiro进行身份验证和授权。

示例一:基本身份验证

在本示例中,我们将演示如何使用Spring Boot Shiro进行基本身份验证。

  1. 创建一个名为UserController的Java类,用于处理HTTP请求。以下是示例代码:
@RestController
public class UserController {
    @GetMapping("/index")
    public String index() {
        return "Welcome to the index page!";
    }
}

在上面的示例中,我们创建了一个名为UserController的类,用于处理HTTP请求。我们使用@RestController注解将该类标记为Spring MVC控制器。我们实现了index方法,用于显示欢迎消息。

  1. 创建一个名为ShiroRealm的Java类,用于实现Shiro的Realm接口。以下是示例代码:
@Component
public class ShiroRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());
        if (!"admin".equals(username) || !"admin".equals(password)) {
            throw new IncorrectCredentialsException();
        }
        return new SimpleAuthenticationInfo(username, password, getName());
    }
}

在上面的示例中,我们创建了一个名为ShiroRealm的类,用于实现Shiro的Realm接口。我们使用@Component注解将该类标记为Spring组件。我们实现了doGetAuthenticationInfo方法,用于身份验证。在该方法中,我们获取用户名和密码,并将它们与预定义的值进行比较。如果用户名或密码不正确,则抛出IncorrectCredentialsException异常。

  1. 创建一个名为ShiroFilter的Java类,用于实现Shiro的Filter接口。以下是示例代码:
@Component
public class ShiroFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        SecurityUtils.setSecurityManager(SecurityUtils.getSecurityManager());
        Subject subject = SecurityUtils.getSubject();
        if (!subject.isAuthenticated() && !subject.isRemembered()) {
            WebUtils.issueRedirect(request, response, "/login");
            return;
        }
        filterChain.doFilter(request, response);
    }
}

在上面的示例中,我们创建了一个名为ShiroFilter的类,用于实现Shiro的Filter接口。我们使用@Component注解将该类标记为Spring组件。我们实现了doFilterInternal方法,用于处理HTTP请求。在该方法中,我们获取当前用户的主题,并检查用户是否已经通过身份验证或记住我。如果用户未通过身份验证或记住我,则将用户重定向到登录页面。

  1. 创建一个名为login.html的HTML文件,用于显示登录页面。以下是示例代码:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="post" action="/login">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
        <br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
        <br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

在上面的示例中,我们创建了一个名为login.html的HTML文件,用于显示登录页面。我们使用form元素创建一个登录表单,其中包含用户名和密码字段。

  1. 配置Shiro

在application.properties文件中添加以下配置:

# Shiro配置
shiro:
  # 登录URL
  loginUrl: /login
  # 登录成功URL
  successUrl: /index
  # 未授权URL
  unauthorizedUrl: /unauthorized
  # Shiro过滤器链配置
  filterChainDefinitions: /static/** = anon\n/login = anon\n/logout = logout\n/** = authc

在上面的示例中,我们配置了Shiro的登录URL、登录成功URL、未授权URL和过滤器链。我们使用filterChainDefinitions属性来指定URL模式和相应的过滤器。

  1. 运行该应用程序,并访问http://localhost:8080/index。您应该会看到一个登录页面。输入用户名和密码“admin”,然后单击“登录”按钮。您应该会看到一个欢迎消息。

示例二:基本授权

在本示例中,我们将演示如何使用Spring Boot Shiro进行基本授权。

  1. 创建一个名为UserController的Java类,用于处理HTTP请求。以下是示例代码:
@RestController
public class UserController {
    @GetMapping("/index")
    public String index() {
        return "Welcome to the index page!";
    }

    @GetMapping("/admin")
    public String admin() {
        return "Welcome to the admin page!";
    }
}

在上面的示例中,我们创建了一个名为UserController的类,用于处理HTTP请求。我们使用@RestController注解将该类标记为Spring MVC控制器。我们实现了index和admin方法,用于显示欢迎消息。

  1. 创建一个名为ShiroRealm的Java类,用于实现Shiro的Realm接口。以下是示例代码:
@Component
public class ShiroRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        User user = (User) principals.getPrimaryPrincipal();
        if ("admin".equals(user.getUsername())) {
            authorizationInfo.addRole("admin");
            authorizationInfo.addStringPermission("user:list");
            authorizationInfo.addStringPermission("user:add");
            authorizationInfo.addStringPermission("user:edit");
            authorizationInfo.addStringPermission("user:delete");
        } else {
            authorizationInfo.addRole("user");
            authorizationInfo.addStringPermission("user:list");
        }
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());
        if (!"admin".equals(username) || !"admin".equals(password)) {
            throw new IncorrectCredentialsException();
        }
        return new SimpleAuthenticationInfo(new User(username, password), password, getName());
    }
}

在上面的示例中,我们创建了一个名为ShiroRealm的类,用于实现Shiro的Realm接口。我们使用@Component注解将该类标记为Spring组件。我们实现了doGetAuthorizationInfo和doGetAuthenticationInfo方法,用于授权和身份验证。在doGetAuthorizationInfo方法中,我们获取用户的角色和权限,并将它们设置为授权信息。在doGetAuthenticationInfo方法中,我们获取用户名和密码,并将它们设置为身份验证信息。

  1. 创建一个名为ShiroFilter的Java类,用于实现Shiro的Filter接口。以下是示例代码:
@Component
public class ShiroFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        SecurityUtils.setSecurityManager(SecurityUtils.getSecurityManager());
        Subject subject = SecurityUtils.getSubject();
        if (!subject.isAuthenticated() && !subject.isRemembered()) {
            WebUtils.issueRedirect(request, response, "/login");
            return;
        }
        filterChain.doFilter(request, response);
    }
}

在上面的示例中,我们创建了一个名为ShiroFilter的类,用于实现Shiro的Filter接口。我们使用@Component注解将该类标记为Spring组件。我们实现了doFilterInternal方法,用于处理HTTP请求。在该方法中,我们获取当前用户的主题,并检查用户是否已经通过身份验证或记住我。如果用户未通过身份验证或记住我,则将用户重定向到登录页面。

  1. 创建一个名为login.html的HTML文件,用于显示登录页面。以下是示例代码:

```html





Login

Login

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot-Shiro基本使用详情介绍 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 分析jackjson的安全漏洞CVE-2019-14379

    分析Jackjson的安全漏洞CVE-2019-14379可以通过以下几个步骤: 1.了解CVE-2019-14379漏洞的背景和影响 CVE-2019-14379是一个由Jackson-databind 库的反序列化漏洞引发的安全问题。这种漏洞可以让攻击者远程执行任意代码,从而导致服务器遭到攻击、数据丢失或泄露。 2.检查自己的应用程序是否受到漏洞的影响 …

    Java 2023年5月26日
    00
  • Java中线程死亡的几种情况实例分析

    Java中线程死亡的几种情况实例分析 当线程执行完任务或者发生异常时,线程将会结束并死亡。本文将详细讲解Java中线程死亡的几种情况实例分析。 线程执行完任务 当线程完成其分配的任务时,线程将自动结束并死亡。例如,下面是一个计算1到100的线程: public class MyThread extends Thread { @Override public …

    Java 2023年5月27日
    00
  • Java web拦截器inteceptor原理及应用详解

    下面我将详细讲解“Java web拦截器inteceptor原理及应用详解”的完整攻略。 什么是拦截器interceptor? 在Java Web开发中,拦截器(Interceptor)又称为拦截器相当于Servlet开发中的过滤器(Filter),用于在业务处理之前或之后,进行一系列自定义的操作。拦截器与过滤器的主要区别在于,过滤器主要用于在请求到达ser…

    Java 2023年5月20日
    00
  • java实现打印日历

    讲解“Java实现打印日历”的完整攻略,步骤如下: 1. 确定打印日历的时间范围 首先需要确定要打印的日历的时间范围,可以让用户输入年份和月份,也可以默认打印当前月份的日历,这里我们以用户输入年份和月份为例。 2. 实现核心算法 接下来需要实现核心算法,根据用户输入的年份和月份,计算出该月份的第一天是星期几,以及该月份有多少天。这里使用Java的Calend…

    Java 2023年6月1日
    00
  • 基于Java的电梯系统实现过程

    实现基于Java的电梯系统完整攻略 1. 设计电梯系统模型 首先,我们需要设计一个电梯系统模型,它应该包含以下几个部分: 电梯类:此类应该包括电梯当前所在楼层、电梯目标楼层、电梯运行状态(上升、下降、停止)等属性,并且应该提供控制电梯上升和下降的方法。 楼层类:此类应该包括楼层的编号、电梯呼叫按钮的状态(有人按下或未按下)等属性,并且应该提供控制电梯到达某个…

    Java 2023年5月19日
    00
  • Java中类与对象的相关知识点总结

    下面是关于“Java中类与对象的相关知识点总结”的详细攻略。 什么是Java中类与对象 Java是一种基于对象的编程语言,类是Java中的基本概念。类是Java中定义对象的模板,由属性和方法组成。而对象则是类的实例,具有类中定义的属性和方法。利用类和对象,我们可以很方便地组织代码、实现代码的复用和扩展。 如何定义类 定义类的格式如下: [public] cl…

    Java 2023年5月26日
    00
  • 把JS与CSS写在同一个文件里的书写方法

    将JS与CSS写在同一个文件中可以减少文件的请求次数,提高页面加载速度。以下是将JS与CSS写在同一个文件里的标准的Markdown格式的书写方法: 1. 在html文件中引入同一个文件 在HTML文件头部中,使用<script>标签引用JavaScript,使用<style>标签引用CSS,代码如下: <head> &l…

    Java 2023年6月15日
    00
  • Java Controller实现参数验证与统一异常处理流程详细讲解

    Java Controller实现参数验证与统一异常处理流程详细讲解 参数验证 当我们在编写Java Web应用的Controller时,经常需要验证请求参数的合法性,例如是否为空、是否符合指定格式、是否在合理范围内等。Spring框架提供了一种方便的方式来进行参数验证,即使用JSR-303标准提供的注解来标识验证规则。我们可以使用javax.validat…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部