spring security 登录拦截(过滤) 那种更符合规范? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linuxsteam
V2EX    Java

spring security 登录拦截(过滤) 那种更符合规范?

  •  
  •   linuxsteam 2020 年 4 月 30 日 5773 次点击
    这是一个创建于 2186 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟最近刚刚研究 security 整合 jwt 想作为前后端分离的项目的后台

    看到网上的文章大概有两种 实现方式

    1. 建立两个过滤器, 一个用来拦截 /login,在 filter 里面写认证 然后进行返回 token 操作,另一个过滤器用来鉴权,拦截其他 URL 。
    2. 只建立一个鉴权过滤器,处理 /login 以外的请求. /login 写在 Controller 里,正常业务操作。跟这个老哥的实现思路一样 t/544387

    小弟有几个疑问:

    1. JWT 这种属于 security 提供的 httpBasic 还是 formLogin 方式? (网上文章看到使用 formLogin 比较多一些,可能是因为它有自定义登录 URL 的方法。)
    2. 文中两种方案哪种更符合设计思想一些?
    第 1 条附言    2020 年 4 月 30 日

    贴下我最后的配置类吧,我使用的也是第一种方案。因为自己写的过滤器,formLogin,httpBasic,这两个人家封装好的处理方案,我全部禁用了

    public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationProvider customAuthenticationProvider; @Autowired private RedisTemplate redisTemplate; /** * @param http * @throws Exception */ @Override proteced void configure(HttpSecurity http) throws Exception { ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = http.authorizeRequests(); registry.and() .formLogin().disable() .authorizeRequests() .antMatchers("/user/login").permitAll() .antMatchers("/user/register").permitAll() .antMatchers("/admin").hasAnyRole("ADMIN") // 任何请求 需要身份认证 .anyRequest().authenticated() .and() // 添加一个过滤 所有访问 /login 的请求给JWTLoginFilter处理 这个类处理所有的JWT相关内容 .addFilterBefore(new JWTLoginFilter("/user/login", HttpMethod.POST.toString(),authenticationManager(),redisTemplate), UsernamePasswordAuthenticationFilter.class) // 添加一个过滤器,验证其他请求是否合法 .addFilterBefore(new JWTAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class) // 关闭跨站请求防护 .csrf().disable() // 前后端分离采用JWT 不需要session .sessionManagement().disable(); } /** * @param auth * @throws Exception */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 使用自定义身份验证组件 auth.authenticationProvider(customAuthenticationProvider); } @Bean public Argon2PasswordEncoder passwordEncoder() { return new Argon2PasswordEncoder(); } } 
    23 条回复    2020-05-03 07:30:36 +08:00
    chenuu
        1
    chenuu  
       2020 年 4 月 30 日
    我是用的第一种
    linuxsteam
        2
    linuxsteam  
    OP
       2020 年 4 月 30 日
    @chenuu 也许咱们看的教程一样 哈哈。那你自定义 userDetailsService 了吗
    Oktfolio
        3
    Oktfolio  
       2020 年 4 月 30 日
    /login 不用管,实现自己的 AuthenticationSuccessHandler 。然后 Jwt 鉴权过滤器。当然我自己还实现了一个 json 登录的过滤器。
    chenuu
        4
    chenuu  
       2020 年 4 月 30 日
    @linuxsteam 定义了.metadatasource,voter 都有自定义.我这规则略复杂些
    linuxsteam
        5
    linuxsteam  
    OP
       2020 年 4 月 30 日
    @Oktfolio 你实现了这个, 那你用的是 formLogin 方式吧?
    nvkou
        6
    nvkou  
       2020 年 4 月 30 日 via Android
    千万别自定义。跟着行规走。不然后面上 sso 不好维护
    hantsy
        7
    hantsy  
       2020 年 4 月 30 日
    Authentication 和 Authorization 两个不同的东西。
    1,Authentication 解决用户是否合法,可以使用 user/password, fingerprint, qrcode, onetimepassword 等方式。
    2, 拿到授权凭证后,比如 token(access_token, id_token), Authorization 是为了判断是否有相应的操作权限。
    EastLord
        8
    EastLord  
       2020 年 4 月 30 日
    2
    JRay
        9
    JRay  
       2020 年 4 月 30 日
    我也打算搞这套,准备用第二套方案
    JRay
        10
    JRay  
       2020 年 4 月 30 日
    突然想到要是用 JWT 的话,强制下线这种操作怎么搞呢?这个是无状态的样,要是另外一个地方也保存了 JWT 强制下线就不好搞了
    bsg1992
        11
    bsg1992  
       2020 年 4 月 30 日
    @JRay jwt 不能用作于中心化的授权场景。 有中心化的场景还是得采用 session 方式
    Guozi1989
        12
    Guozi1989  
       2020 年 4 月 30 日
    @JRay 配合 redis 来做
    tang123456
        13
    tang123456  
       2020 年 4 月 30 日
    目前我们公司用的是第一种,这两天搭项目我也用的第一种
    linuxsteam
        14
    linuxsteam  
    OP
       2020 年 4 月 30 日
    @JRay 放到 redis 里,我现在写完了,发现跟 spring security 的初衷越来越远了
    linuxsteam
        15
    linuxsteam  
    OP
       2020 年 4 月 30 日
    @tang123456 这种方式去写的话,感觉就用了 security 的令牌以及权限处理,认证几乎是自己写的吧(实现的自己的过滤器)
    securityCoding
        16
    securityCoding  
       2020 年 4 月 30 日
    1.认证和鉴权是两件事情,第一种是对的
    2. @JRay 业务复杂度上来了都会走上 session 这条路
    3. 如果在用 spring-cloud 的话 ,我个人推荐还是通过 spring-cloud-gateway 网关自己写 filter 来实现, 把认证和鉴权这种业务无关的行为收拢到网关层面,将复杂度控制在网关层面 ,底层服务聚焦业务即可,只管读相关登录态属性(比如 uid...)
    securityCoding
        17
    securityCoding  
       2020 年 4 月 30 日
    @linuxsteam 哈哈 , 写完发现都是自己的代码,还引入 security 这个复杂的组件...
    luckyrayyy
        18
    luckyrayyy  
       2020 年 4 月 30 日 via iPhone
    我是第二种 login 放在 controller 里面。
    jwt 用的继承 httpbasic
    linuxsteam
        19
    linuxsteam  
    OP
       2020 年 4 月 30 日
    @securityCoding 自己代码还算一般吧,就是比较费劲,如你所说:第一种使用 Security 比较多。
    我用的不是 cloud,是自己爱好写的。写完了,感觉有点泄劲哈哈
    Newyorkcity
        20
    Newyorkcity  
       2020 年 4 月 30 日
    问下楼主学习 spring security 看什么文档?我看官方文档那么长,读了一两个小时了,我愣是没找到从数据库获取账户密码来进行验证的功能..
    iX8NEGGn
        21
    iX8NEGGn  
       2020 年 4 月 30 日 via iPhone
    @Newyorkcity 这种是业务,security 不会帮你实现,你要自己实现 UserDetails 接口
    iX8NEGGn
        22
    iX8NEGGn  
       2020 年 4 月 30 日 via iPhone
    @iX8NEGGn 说错了是 UserDetailsService 接口
    linuxsteam
        23
    linuxsteam  
    OP
       2020 年 5 月 3 日 via Android
    @Newyorkcity 如果你想遵守官方得方式,重写 jdbcUserDetails 的方法(service,带不带 service 我忘记了)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3072 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 103ms UTC 06:05 PVG 14:05 LAX 23:05 JFK 02:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86