java - Java中损坏的访问控制
问题描述
我正在尝试更新以下代码示例(Java)以防止损坏的访问控制,我在理论上了解损坏的访问控制。但是我被困在我需要围绕用户名进行的令人兴奋的代码更改上,以便用户只能看到允许看到的内容。
任何帮助都会很棒
import java.sql.*;
import java.util.*;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Claims;
class LoggedOutException extends Exception {
public LoggedOutException(String message) {
super(message);
}
}
public class External{
public static HashMap<String, String> accountLookup(String accountId, String jwt) throws Exception{
if (jwt == null) { ;
throw new LoggedOutException("User is not logged in");
} else {
Claims claims = Jwts.parser()
.setSigningKey("Key".getBytes("UTF-8"))
.parseClaimsJws(jwt).getBody();
if ((claims.get("logged_in")).toString().equals("true")) {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://mysql:3306/BankApp?useSSL=false", "root", "letmein");
Statement stmt = con.createStatement();
ResultSet rs=stmt.executeQuery("SELECT username FROM tbl_user WHERE id = '" + accountId + "';");
if (!rs.next()) {
con.close();
throw new Exception("Account not found");
}
String user = new String();
user = rs.getString("username");
rs=stmt.executeQuery("SELECT balance, dob FROM tbl_account WHERE user_id = '" + accountId + "';");
HashMap<String, String> results = new HashMap<String, String>();
if(rs.next()){
results.put("balance", rs.getString("balance").toString());
results.put("dob", rs.getString("dob").toString());
results.put("username", user);
}
con.close();
return results;
} else {
throw new LoggedOutException("User is not logged in");
}
}
}
}
解决方案
您可以做的是向您的令牌有效负载添加自定义声明,您以后可以使用它来验证用户是否有权执行该操作。
在这里,我在令牌有效负载中添加了“用户名”。
Jwts.builder()
.claim("username", username)
.claim("role", role)
.setIssuedAt(Date.from(Instant.ofEpochSecond(1629736517L)))
.setExpiration(Date.from(Instant.ofEpochSecond(1661272517L)))
.signWith(
SignatureAlgorithm.HS256,
"Simple Secret"
)
.compact();
然后你可以在你的 accountLookup 方法中访问它,
Claims claims = Jwts.parser()
.setSigningKey("Simple Secret")
.parseClaimsJws(token).getBody();
String username = (String) claims.get("username");
使用用户名验证 accountId。
推荐阅读
- javascript - Blazor 启用动态根组件/错误:此应用程序中未启用动态根组件
- flutter - 当我从 github 运行颤振项目时出现此错误...我尝试了一切
- ruby-on-rails - Rails Devise - 单独的confirm_within time for reconfirmable
- php - PHP如何用范围()和额外的数字填充变量
- python - 如何对 PySpark Dataframe 中的每一行执行复杂的处理
- vue.js - Vue 2. 如何通过 v-model 绑定获取子值
- python-3.x - Python程序查找目标元素的开始和结束索引(类型错误:leetcode中的不可散列列表)
- django - 无法从测试中检查 Django 迁移,但可以使用 Django 命令
- append - Power Query - 减去不连续的行并创建一个新行
- reactjs - 如何在 Nextjs 中导入两个组件