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日

相关文章

  • SpringBoot全局异常处理方式

    当我们使用SpringBoot开发应用程序时,难免会遇到各种异常,在没有对异常进行处理时,用户会得到一些看不懂或不能理解的提示信息,这对于用户来说是非常不友好的,所以我们需要设置全局异常处理方式来帮助用户更好地理解我们的应用程序。 以下是关于SpringBoot全局异常处理的完整攻略,包括两个示例: 1. 全局异常处理方式 在SpringBoot中,我们可以…

    Java 2023年5月19日
    00
  • jmap执行失败了,怎么获取heapdump?

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。 在之前的OOM问题复盘中,我们添加了jmap脚本来自动dump内存现场,方便排查OOM问题。 但当我反复模拟OOM场景测试时,发现jmap有时可以dump成功,有时会报错,如下:经过网上一顿搜索,发现两种原因可能导致这个问题,一是执行jmap用户与jvm进程用户不一致,二…

    Java 2023年4月17日
    00
  • SpringBoot+MybatisPlus+代码生成器整合示例

    下面是详细讲解“SpringBoot+MybatisPlus+代码生成器整合示例”的完整攻略。 准备工作 首先需要创建一个SpringBoot项目。在pom.xml文件中添加MybatisPlus和代码生成器的依赖。 <dependency> <groupId>com.baomidou</groupId> <arti…

    Java 2023年5月19日
    00
  • 浅谈servlet3异步原理与实践

    浅谈servlet3异步原理与实践 什么是Servlet3异步 Servlet3.0规范中增加了异步处理的功能,使Servlet容器的性能可以进一步提升。Servlet3.0之前,servlet都是由线程来处理的,每次请求都需要创建一个线程,处理完请求后才会销毁这个线程。如果请求量很大,反复创建销毁线程的过程会给服务器造成很大负担。 而异步Servlet能够…

    Java 2023年5月20日
    00
  • spring boot整合jsp及设置启动页面的方法

    下面是详细讲解“spring boot整合jsp及设置启动页面的方法”的完整攻略: 1. 添加依赖 要使用JSP,需要在pom.xml文件中添加以下依赖项: <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-em…

    Java 2023年6月15日
    00
  • JAVA代码块你了解吗

    当提到Java代码块时,一般指的是静态代码块和实例代码块。这两种代码块通常用于在类被实例化之前或初始化之前执行某些操作。下面我将详细讲解Java代码块的使用方法和注意事项,包括静态代码块和实例代码块的具体作用和范围、执行顺序以及示例说明。 Java代码块的作用和范围: 静态代码块:它用于在类被加载到内存中时执行初始化或一次性操作。静态代码块是用 static…

    Java 2023年5月30日
    00
  • java+jdbc+mysql+socket搭建局域网聊天室

    搭建局域网聊天室的完整攻略需要分为两个大步骤:第一步是利用Java编写前端应用程序,第二步是搭建后端服务器和数据库。 前端应用程序 前端应用程序使用Java编写,涉及到JDBC的使用和Socket编程。 1. 编写UI界面 首先,需要编写一个简单的UI界面,用于用户输入聊天室的地址和端口号,以及昵称和消息发送框。 public class ChatRoomC…

    Java 2023年6月1日
    00
  • 关于三种主流WEB架构的思考

    非常感谢您浏览我们网站上的“关于三种主流WEB架构的思考”这篇文章。在本文中,我们将围绕三种主流WEB架构(MVC、MVP、MVVM)进行详细的介绍和比较分析。 1. 介绍三种主流WEB架构 MVC MVC架构是由模型、视图和控制器三个核心组件构成的架构模式。它的主要思想是将业务逻辑、用户交互和数据模型分离开来,从而使代码更加整洁、结构更加清晰。 模型:负责…

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