• 注册
当前位置:代码四四五 > 默认分类 >正文

使用Play Framework进行用户身份验证的实现方式

这是一段使用Play Framework 2.6来实现用户身份验证的示例代码。该代码通过向未经身份验证的用户重定向并将该页面保护起来,同时也提供了忘记密码和登出功能。身份验证使用了Play Framework提供的内置身份验证系统Authenticator,同时也使用了BCrypt密码哈希算法。

public class Secured extends Security.Authenticator {

    @Inject
    private UserService userService;

    @Override
    public Result onUnauthorized(Context ctx) {
        return redirect(routes.AuthenticationController.login());
    }

    @Override
    public Optional<String> getUsername(Http.Request request) {
        String authToken = request.getQueryString("authToken");
        if (authToken != null && !authToken.isEmpty()) {
            Optional user = userService.findByAuthToken(authToken);
            if (user.isPresent()) {
                return Optional.ofNullable(user.get().email);
            }
        }
        return Optional.empty();
    }
}

public class AuthenticationController extends Controller {

    @Inject
    private UserService userService;

    public Result login() {
        return ok(views.html.login.render(Form.form(Login.class)));
    }

    public Result authenticate() {
        Form form = Form.form(Login.class).bindFromRequest();
        if (form.hasErrors()) {
            return badRequest(views.html.login.render(form));
        } else {
            Login login = form.get();
            Optional user = userService.authenticate(login.email, login.password);
            if (user.isPresent()) {
                String authToken = user.get().createToken();
                userService.saveAuthToken(user.get().id, authToken);
                response().setCookie(Http.Cookie.builder("authToken", authToken).build());
                return redirect(routes.Application.index());
            } else {
                flash("error", "Invalid email or password");
                return redirect(routes.AuthenticationController.login());
            }
        }
    }

    public Result logout() {
        response().discardCookie("authToken");
        return redirect(routes.AuthenticationController.login());
    }
}

public class UserServiceImpl implements UserService {

    @Inject
    private UserRepository userRepository;

    @Override
    public Optional findByAuthToken(String authToken) {
        return userRepository.findByAuthToken(authToken);
    }

    @Override
    public Optional authenticate(String email, String password) {
        Optional user = userRepository.findByEmail(email);
        if (user.isPresent() && BCrypt.checkpw(password, user.get().password)) {
            return user;
        } else {
            return Optional.empty();
        }
    }

    @Override
    public void saveAuthToken(Long userId, String authToken) {
        userRepository.saveAuthToken(userId, authToken);
    }
}

免责申明:文章和图片全部来源于公开网络,如有侵权,请通知删除 162202241@qq.com

最新评论
  • 汪钧
    2024-03-29 电脑端
    # 1楼
    play游戏使用此账号登录游戏

    个人签名,ta还没设置签名

    拉黑 举报 打赏 回复
  • 后新
    2024-03-29 电脑端
    # 2楼
    playdrm认证教程

    个人签名,ta还没设置签名

    拉黑 举报 打赏 回复
  • 匡娴
    2024-03-29 电脑端
    # 3楼
    play商店身份验证

    个人签名,ta还没设置签名

    拉黑 举报 打赏 回复
  • 牛鸣慧
    2024-03-29 电脑端
    # 4楼
    使用playfair密码加密

    个人签名,ta还没设置签名

    拉黑 举报 打赏 回复
  • 廖泰
    2024-03-29 电脑端
    # 5楼
    密钥:cipher

    个人签名,ta还没设置签名

    拉黑 举报 打赏 回复
  • 司空朗坚
    2024-03-29 电脑端
    # 6楼
    play商店需要验证身份怎么解决

    个人签名,ta还没设置签名

    拉黑 举报 打赏 回复
  • 昌伟
    2024-03-29 电脑端
    # 7楼
    play设备认证

    个人签名,ta还没设置签名

    拉黑 举报 打赏 回复

欢迎您发表评论:

请登录之后再进行评论

登录