spring security对基于数据库的认证支持仅限于JDBC,而很多项目并非使用JDBC,比如Nosql数据库很多使用的是 Mongo Java Driver,这样就无法用默认的<jdbc-user-service>
进行支持认证。
如果项目不是使用JDBC,没么解决办法就是:自己定义一个认证服务。
新建一个CustomUserDetailsService
类
这个类实现了UserDetailsService
接口。代码如下:
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
MongoDBHelper dbhelper;
/*
* 根据用户名加载认证用户
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//步骤一:从数据库中查出用户数据
MongoDatabase db = dbhelper.getDB("huanle");
MongoCollection<Document> users = db.getCollection("user");
Document filter = new Document();
filter.append("account",username);
Document result = users.find(filter).first();
if(result==null) throw new UsernameNotFoundException(username+"不存在");
//步骤二:装配到UserDetails,相当于生成了一个<user>标签
UserDetails userDetails = new User(result.getString("account"), result.getString("password"), true, true, true, true,getAuthorities(result.getInteger("access")) );