cuốn sách gpt4 ai đã làm

Thảo luận hai cách lưu trữ Token trong Redis

In lại Tác giả: Người biết Thời gian cập nhật: 2024-03-13 09:42:03 29 4
mua khóa gpt4 Nike

Bài viết này được chia sẻ từ Cộng đồng Huawei Cloud"Thảo luận hai cách lưu trữ Token trong Redis", tác giả: Lạc Diệp Phiêu.

Bài viết này thảo luận về một vấn đề:

Khi lưu trữ mã thông báo, ai sẽ đóng vai trò là chìa khóa giữa mã thông báo và ID người dùng tương ứng?

Nguồn gốc của vấn đề

Vấn đề bắt nguồn từ nhu cầu thêm tính năng quản lý quyền vào hệ thống quản lý phụ trợ của công ty. Khung mã nguồn mở đã được chọn, nhưng hệ thống ban đầu đã sử dụng mã thông báo để xác minh đăng nhập.

Phương pháp xác minh Shiro mà tôi sử dụng là lấy ID người dùng dựa trên mã thông báo cho từng yêu cầu giao diện, sau đó thực hiện xác minh quyền thông qua cơ chế xác minh đăng nhập trong Shira.

Do đó, việc "lấy ID người dùng dựa trên mã thông báo" yêu cầu khi lưu trữ mã thông báo người dùng, mã thông báo được sử dụng làm khóa và ID người dùng được sử dụng làm giá trị.

Tuy nhiên, một vấn đề gặp phải vào thời điểm này là phương thức lưu trữ mã thông báo ban đầu của hệ thống như sau, mà chúng tôi gọi là loại đầu tiên: ID người dùng là khóa.

cache.set(TOKEN_PREFIX + userid, token);

Điều này đòi hỏi tôi phải đưa ra phán đoán xem liệu tôi có cần sửa đổi phương thức lưu trữ mã thông báo thành dạng sau hay không: Chúng tôi gọi đó là loại thứ hai: mã thông báo là khóa.

cache.set(TOKEN_PREFIX + token, userid);

nghĩ

Câu hỏi đầu tiên là liệu cả hai phương pháp có đạt được các chức năng cần thiết không?

Các chức năng chúng ta cần thực hiện bao gồm:

  1. Xác minh đăng nhập
  2. Xác minh quyền trong shiro

Xác minh đăng nhập

Đối với phương thức "user ID as key", giao diện người dùng cần chuyển hai giá trị id người dùng + mã thông báo. Để xác minh trạng thái đăng nhập, chúng ta cần lấy mã thông báo được lưu trữ trong cơ sở dữ liệu dựa trên ID người dùng. được giao diện người dùng chuyển qua và xác minh nó bằng mã thông báo do giao diện người dùng chuyển. Nếu chúng nhất quán thì quá trình xác minh sẽ được chuyển, nếu không, thông báo lỗi sẽ được trả về, nhắc người dùng đăng nhập lại, v.v.

Đối với phương thức "mã thông báo làm khóa", giao diện người dùng cần chuyển ít nhất một giá trị của mã thông báo. Theo mã thông báo được giao diện người dùng chuyển, ID người dùng được lưu trữ trong cơ sở dữ liệu sẽ được lấy. Nếu không, người dùng sẽ được nhắc rằng mã thông báo đã hết hạn và người dùng được yêu cầu đăng nhập lại, v.v.

Xác minh quyền trong shiro

Việc xác minh quyền trong shiro bao gồm một cơ chế triển khai cụ thể, sử dụng mã thông báo làm chìa khóa. Hãy lấy việc triển khai thực tế của chúng tôi làm ví dụ:

// mã đăng nhập shiro: Chủ đề s = SecurityUtils.getSubject(); JWTToken jwtToken = new JWTToken(token); topic.login(jwtToken); // Lớp triển khai AuthenticationToken: import org.apache.shiro.authc.AuthenticationToken; lớp JWTToken triển khai AuthenticationToken { riêng tư cuối cùng dài serialVersionUID = 1L; Mã thông báo chuỗi riêng tư chính; public JWTToken(String token) { this.token = token; } @Override public Object getPrincipal() { return token; } @Override public Object getCredentials() { return token; lớp xác minh đăng nhập: */ lớp công khai ShiraDbRealm mở rộng AuthorizingRealm{ /** * Ghi đè mã thông báo của shiro */ @Ghi đè boolean công khai hỗ trợ (Mã thông báo xác thực) { return token instanceof JWTToken; } /** * Vai trò, xác thực quyền hạn*/ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection các nguyên tắc) { SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); tới tài khoản người dùng Truy vấn quyền vai trò của người dùng và thông tin khác trả về simpleAuthorizationInfo; } /** * Xác thực tùy chỉnh */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) ném AuthenticationException { String token = (String) auth.getCredentials(); // Giải mã để lấy userid để so sánh với cơ sở dữ liệu // getUserId thực tế là thông qua mã thông báo, trong Lấy userid tương ứng từ cơ sở dữ liệu Integer userid = JwtUtils.getUserId(token); (tuserid == null) { ném AuthenticationException mới ("xác minh mã thông báo không thành công"); } trả về SimpleAuthenticationInfo mới (mã thông báo, mã thông báo, getName());

Nếu userid được sử dụng làm khóa thì việc triển khai không khó và phương pháp triển khai cũng có thể được sửa đổi.

Câu hỏi thứ hai là, phương pháp nào truyền ít dữ liệu hơn?

Phương thức đầu tiên yêu cầu giao diện người dùng chuyển mã thông báo+userid trong mọi yêu cầu; trong khi phương thức thứ hai thực sự chỉ có thể chuyển mã thông báo và nền lấy thông tin người dùng dựa trên giải mã mã thông báo (hoặc tìm kiếm cơ sở dữ liệu).

Câu hỏi thứ ba là, phương pháp nào trong hai phương pháp này an toàn hơn?

Tính bảo mật của hai phương thức phải giống nhau. Cốt lõi là lưu thông tin tương ứng giữa mã thông báo và userid thông qua cơ sở dữ liệu ở chế độ nền.

ý kiến ​​cá nhân

Cá nhân tôi muốn tinh chỉnh phương pháp thứ hai, sử dụng mã thông báo làm khóa. Thứ nhất, việc truyền tải giao diện người dùng rất đơn giản và chỉ cần chuyển mã thông báo thứ hai, thông qua phương pháp này, mặt sau có thể thống nhất phương thức mua lại; của người đăng nhập hiện tại thay vì mỗi lần đăng nhập.

Nhấp để theo dõi và tìm hiểu về các công nghệ mới của Huawei Cloud càng sớm càng tốt~

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress