RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 611928
Accepted
Bleser
Bleser
Asked:2020-01-07 23:10:49 +0000 UTC2020-01-07 23:10:49 +0000 UTC 2020-01-07 23:10:49 +0000 UTC

Spring Security 用户授权

  • 772

我试图弄清楚如何实现授权,我设法做到了,但它只能在浏览器重新启动之前起作用。

我在谷歌上搜索了在单独的服务器上为客户端实现授权的示例,但到处都是与 JSP 相同的文章,最终决定尝试为我自己采用其中一个并实现以下类 UserDetailsService和AuthenticationManager一个授权类AuthenticateService。然后我决定添加rememberm-me功能,在config中添加设置,在数据库中添加了一个表,但是在授权时,没有添加cookie和数据库条目。也许在使用 rememberm-me 时你需要不使用UsernamePasswordAuthenticationToken或添加某种过滤器?所以我想知道应该使用哪些接口\类通过令牌进行授权。

@Component
public class CustomUserDetails implements UserDetailsService {

    @Autowired
    private UserRepo userRepo;


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        EntityUser user = userRepo.findByUsername(username);
        List<GrantedAuthority> grantedAuthorities =new ArrayList<>();

        for (EntityRole entityRole : user.getRoles()) {
            grantedAuthorities.add(new SimpleGrantedAuthority(entityRole.getRoleName()));
        }

        return new User(user.getUsername(),user.getPassword(),grantedAuthorities);
    }
 }

@Component
public class CustomAuthentivationManager implements AuthenticationManager {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private CustomUserDetails customUserDetails;


    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        UserDetails userDetails =  (UserDetails) authentication.getPrincipal();
        if (userDetails.getPassword().equals(authentication.getPrincipal())){
            authentication.setAuthenticated(true);
    }
        return authentication;
    }
}

@Service
public class AuthenticateService implements IAuthentivateService {

    @Autowired
    private CustomAuthentivationManager authenticationManager;

    @Autowired
    private CustomUserDetails customUserDetails;


    @Override
    public String findLigInUsername() {
        Object userDetails = SecurityContextHolder.getContext().getAuthentication().getDetails();
        if (userDetails instanceof UserDetails){
            return ((UserDetails) userDetails).getUsername();
        }
        return null;
    }

    @Override
    public boolean autologin(String username, String password) {
        UserDetails userDetails = customUserDetails.loadUserByUsername(username);
        UsernamePasswordAuthenticationToken token
            = new UsernamePasswordAuthenticationToken(userDetails,password,userDetails.getAuthorities());

        authenticationManager.authenticate(token);

        if (token.isAuthenticated()){
            SecurityContextHolder.getContext().setAuthentication(token);
            return true;
        }
        return false;
    }
}
java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Bleser
    2020-01-08T20:40:40Z2020-01-08T20:40:40Z

    现在 cookie 被发送到客户端,token 也存储在数据库中。我是这样做的:
    1)我们继承自PersistentTokenBasedRememberMeServicesoverride 方法onLoginSuccess并将其公开。
    2) 从步骤 1 创建一个类 bean
    3) 在控制器中,为映射到登录页面 URL 的方法的参数添加HttpServletRequest request, HttpServletResponse response,例如

    @RequestMapping(value = "/api/login", method = RequestMethod.POST, produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
        public void postLogin(@RequestBody EntityUser body, HttpServletRequest request, HttpServletResponse response) {
    UserDetails userDetails = detailsService.loadUserByUsername(username);
    
            UsernamePasswordAuthenticationToken token =
                new UsernamePasswordAuthenticationToken(username,user.getPassword(),userDetails.getAuthorities());
    
            myTokenRememberMeService.onLoginSuccess(req,res,token);
    
            if (token.isAuthenticated())
            SecurityContextHolder.getContext().setAuthentication(token);
    }    
    

    4)创建一个令牌UsernamePasswordAuthenticationToken,填写并调用将onLoginSuccess创建的令牌作为参数之一传递的方法,检查身份验证是否已通过并将令牌添加到安全上下文中。
    PS 我有这样的感觉,这是一个硬拐杖,你可以让一切变得更容易,但现在它工作正常))

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5