SecurityUtils.getSubject().Principals()为null
时间: 2024-04-25 18:23:38 浏览: 211
您在代码中使用了`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 进行权限控制。
阅读全文