SecurityUtils.getSubject().Principals()为null

时间: 2024-04-25 16:23:38 浏览: 14
您在代码中使用了`SecurityUtils.getSubject().getPrincipals()`方法,但返回值为`null`。这可能是由于以下原因之一: 1. 用户未登录:在调用此方法之前,必须确保用户已经成功登录。如果用户未登录或会话已过期,那么`getSubject()`方法将返回一个未经身份验证的主体对象,其`getPrincipals()`方法返回`null`。 2. 未配置正确的身份验证和授权机制:如果您没有正确配置Shiro的身份验证和授权机制,那么可能无法获取到正确的主体对象和凭证。请确保您已正确配置了Shiro的`SecurityManager`、`Realm`和`SessionManager`等组件。 3. 未设置Principal:如果用户已成功登录,但没有设置主体对象的Principal(身份标识),那么`getPrincipals()`方法将返回`null`。请确保您在用户登录时设置了正确的Principal。 请检查上述原因,并根据情况进行相应的调整和修复。如果问题仍然存在,请提供更多相关的代码和配置信息,以便我们能够更好地帮助您解决问题。
相关问题

shiro ajax登录的简单例子,要包括.xml文件

以下是基于 Shiro 的 Ajax 登录的简单示例,包括.xml文件: 1. 创建一个login.html页面,包括一个表单和jQuery代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> </head> <body> <h2>Login</h2> <form id="loginForm"> <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> <div id="message"></div> <script> $(document).ready(function() { $('#loginForm').submit(function(e) { e.preventDefault(); $.ajax({ type: 'POST', url: 'login', data: $(this).serialize(), success: function(data) { if (data.success) { window.location.href = 'index.html'; } else { $('#message').text(data.message); } } }); }); }); </script> </body> </html> ``` 2. 创建一个Controller类,处理登录请求,返回JSON数据: ```java @Controller public class LoginController { @RequestMapping(value = "/login", method = RequestMethod.POST) @ResponseBody public Map<String, Object> login(HttpServletRequest request, HttpServletResponse response) { Map<String, Object> result = new HashMap<>(); String username = request.getParameter("username"); String password = request.getParameter("password"); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { SecurityUtils.getSubject().login(token); result.put("success", true); } catch (UnknownAccountException e) { result.put("success", false); result.put("message", "Unknown account"); } catch (IncorrectCredentialsException e) { result.put("success", false); result.put("message", "Incorrect password"); } catch (LockedAccountException e) { result.put("success", false); result.put("message", "Account is locked"); } catch (AuthenticationException e) { result.put("success", false); result.put("message", "Authentication failed"); } return result; } } ``` 3. 配置Shiro的.xml文件,包括Shiro的过滤器和Realm: ```xml <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login.html"/> <property name="successUrl" value="/index.html"/> <property name="unauthorizedUrl" value="/unauthorized.html"/> <property name="filterChainDefinitions"> <value> /login = anon /logout = logout /static/** = anon /** = authc </value> </property> </bean> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"/> </bean> <bean id="myRealm" class="com.example.MyRealm"> <property name="credentialsMatcher" ref="hashedCredentialsMatcher"/> </bean> <bean id="hashedCredentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <property name="hashAlgorithmName" value="SHA-256"/> <property name="hashIterations" value="1000"/> </bean> ``` 4. 创建一个Realm类,实现Shiro的认证和授权方法: ```java public class MyRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // TODO: 实现授权方法 } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken userToken = (UsernamePasswordToken) token; String username = userToken.getUsername(); User user = userService.getUserByUsername(username); if (user == null) { throw new UnknownAccountException(); } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } } ``` 以上是一个基于 Shiro 的 Ajax 登录的简单示例,可以参考实现自己的功能。

shiro框架举例

Shiro 是一个 Java 安全框架,提供了身份认证、授权、加密等安全功能,可以帮助开发者快速构建安全可靠的应用程序。以下是一个使用 Shiro 框架的简单示例: 1. 引入 Shiro 依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> ``` 2. 配置 Shiro: ```java // 创建 SecurityManager DefaultSecurityManager securityManager = new DefaultSecurityManager(); // 设置 Realm securityManager.setRealm(new MyRealm()); // 将 SecurityManager 设置到 SecurityUtils 中 SecurityUtils.setSecurityManager(securityManager); ``` 3. 自定义 Realm: ```java public class MyRealm extends AuthorizingRealm { // 在 Realm 中实现身份认证逻辑 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 获取用户名和密码 String username = (String) token.getPrincipal(); String password = new String((char[]) token.getCredentials()); // 根据用户名查询用户信息 User user = userRepository.findByUsername(username); // 判断用户是否存在 if (user == null) { throw new UnknownAccountException("用户名不存在"); } // 校验密码 if (!password.equals(user.getPassword())) { throw new IncorrectCredentialsException("密码错误"); } // 返回身份认证信息 return new SimpleAuthenticationInfo(user, password, getName()); } // 在 Realm 中实现授权逻辑 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 获取当前登录用户信息 User user = (User) principals.getPrimaryPrincipal(); // 查询用户角色和权限信息 List<Role> roles = roleRepository.findByUserId(user.getId()); List<Permission> permissions = permissionRepository.findByUserId(user.getId()); // 创建授权信息对象 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 添加角色和权限信息 for (Role role : roles) { authorizationInfo.addRole(role.getName()); } for (Permission permission : permissions) { authorizationInfo.addStringPermission(permission.getName()); } // 返回授权信息 return authorizationInfo; } } ``` 4. 在 Controller 中使用 Shiro: ```java @Controller public class UserController { @RequiresAuthentication @GetMapping("/users/{id}") public String getUser(@PathVariable Long id, Model model) { // 获取当前登录用户信息 User user = (User) SecurityUtils.getSubject().getPrincipal(); // 判断当前用户是否有查看用户信息的权限 if (!SecurityUtils.getSubject().isPermitted("user:view:" + id)) { throw new UnauthorizedException("没有权限查看用户信息"); } // 查询用户信息 User targetUser = userRepository.findById(id); // 将用户信息放入 Model 中 model.addAttribute("user", targetUser); // 返回模板页面 return "user"; } } ``` 以上示例演示了如何使用 Shiro 实现身份认证和授权功能,在 Controller 中使用 Shiro 进行权限控制。

相关推荐

最新推荐

recommend-type

Mysql 教程(Markd格式 经典全面 看这一个资料就够了)

Mysql 教程(Markd格式 经典全面 看这一个资料就够了)涵盖了mysql工作流、事务、锁、索引、性能优化、运维和配置等各个方面。
recommend-type

pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

my-tv-v2.1.2.apk

电视剧里面了
recommend-type

debugpy-1.6.2-cp39-cp39-macosx_10_15_x86_64.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

泛微OAE10,E-Builder零代码应用构建平台操作手册

泛微OAE10,E-Builder零代码应用构建平台操作手册
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB图像处理算法宝典:从理论到实战

![MATLAB图像处理算法宝典:从理论到实战](https://img-blog.csdnimg.cn/20200717112736401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1emhhbzk5MDE=,size_16,color_FFFFFF,t_70) # 1. MATLAB图像处理基础理论 MATLAB图像处理是一种利用MATLAB编程语言进行图像处理的强大工具。它提供了丰富的函数和工具箱,用于图像获取、增强、分
recommend-type

matlab中1/x的非线性规划

在MATLAB中,可以使用非线性规划函数(`fmincon`)来优化一个包含1/x的非线性目标函数。下面是一个简单的例子: ```matlab % 定义目标函数 fun = @(x) 1/x; % 定义约束函数(这里没有约束) nonlcon = []; % 定义初始点 x0 = 1; % 定义优化选项 options = optimoptions('fmincon', 'Display', 'iter'); % 进行非线性规划 [x, fval] = fmincon(fun, x0, [], [], [], [], [], [], nonlcon, options); ``` 在
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。