peinhu

213 经验值

https://github.com/peinhu/AetherUpload-Laravel 让laravel轻松支持上传大文件,代码都不用写。

@justtest 得,需要这么较真吗?Laravel作为一个吹牛吹那么厉害人气那么高的框架,我用下来也觉得不错,但是在使用过程中却被这个问题困扰了好几天,心里是比较急躁的,因为这个登陆验证从整个项目来说只是第一步,然而第一步就卡壳了,下面的怎么办。这很打击人的积极性,我有将近好几天的时间都在看登陆、验证、找回那部分的框架源码,一个框架,在你必须看源码的基础上才能用?这个在之前我是从来没遇到过的,我之前用thinkphp做项目,从来没看过它的源码,手册写得很详尽,再不行搜索一下也解决问题了。然而Laravel的这个问题搜索谷歌也没有好的答案,所以只能自己去提问了,想有个高手能给出合适的解决方法,可是问遍了各大论坛社区甚至国外的laravel.io,都没有人能给出满意的答案。
你们说的那些方法其实我在提问之前都已经用过了,这个问题难点是Laravel控制了整个验证登陆的流程,我所做的只是改了hash方法,但是流程还是原来的,里面并没有获取salt的代码,然而只有在这个流程里才能获得salt。。。所以结论就是必须把控制验证流程的相关方法给覆写了,那样相当于要覆写Eloquent,所以具体要怎么做我还不清楚。
现在我已经放弃改成md5+salt了,确实麻烦的要死,就算像你说的只要增加一两个方法就能解决,但是不知道你试过没有,注册、验证、找回这几个环节并不是共用一个东西的,你还是要改好几个地方。本来我想的是都说Laravel低耦合很灵活,我只要把某个service替换成自己的就万事大吉了,谁知道并不是这么简单的一件事,是我太理想化了。
虽然我最后放弃了这个修改,但是还是给后来人一些参考吧。其实有一个取巧的办法,就是用md5(password)来代替salt,这样就不用去数据库取salt值了,即加密方式为md5(password+md5(password))。这只需要改写替换一下默认的HashService就行了,不用改流程。但是这样做有个弊端,就是相同密码的用户hash出来的值是一样的,一定程度上降低了安全性。
最后,我想说明一下你认为我用那样的语气态度不好,其实是因为我心里已经比较急躁了,想快点吸引更多的人来关注,从而解决这个卡住我好几天的问题,并不是我故意以这样的态度来提问。其实这个问题也不是我一个人碰到的,v2的那个楼主就也碰到了,同样也找不到方法,说不定还有更多的人在这个问题上卡住。如果我不那么说,不用那样的语气,也许没人会来关注也没人回复,这个问题也就无解了。

@JellyBool 那样需要改vendor中的文件了,登录过程是在Illuminate\Auth\Guard的attempt方法中实现的,也是写死的。

@JellyBool 注册是没问题,但登录认证的时候就有问题了,登录时你是通过什么把salt值带到自己写的hash方法中的?你之前的MD5Hasher服务的make方法中并没有带入任何salt值呀

public function make($value, array $options = []) {
        return md5($value);//你可以在这里实现你想要的加密方式
    }

@JellyBool 其实就是要带入salt的问题,你的例子中没有获取salt的部分,验证必需是md5(提交的password+数据库中读取的用户salt)

@JellyBool 其实就是把密码加密的方式从bcrypt(password)改成md5(password+salt),数据库中就是增加了一个salt字段,用户注册的时候会自动随机生成一个N位salt字符串,现在注册和密码重设的那部分都已经解决了,就是在验证部分遇到了问题,因为laravel把验证部分写死在vendor里,具体见Illuminate\Auth\EloquentUserProvider中的validateCredentials()方法,$this->hasher可以用自己的service替换,但是check()方法它写死了,它只check你hash(password)后的值是否等于数据库字段中的值,可是我这边还有salt,是不是要把EloquentUserProvider也重写或者覆盖?

@JellyBool 感谢回复,我自己搞搞已经做到你这一步了,但困扰的地方就是我这边是md5+salt,现在的问题就是不知道如何把已经存在数据库中的salt带进去?你这边好像也没有给出,我采用的是md5($password.$salt)

想把默认的bcrypt密码加密方式换成md5+salt,在不改vendor的情况下很麻烦,不知道为什么laravel非要把bcrypt作为默认加密方式写到vendor里面?就算自己写service也是有很多相关的东西是写死在vendor里面的,这点觉得很不爽啊

为什么要委婉,不是国外难道是国内吗。。。楼上的台湾就等你去收复了O(∩_∩)O