ITKeyword,专注技术干货聚合推荐

注册 | 登录

spring security 安全框架remember me,demo学习

freewebsys 分享于 2015-11-25

推荐:SpringSide 3 中的安全框架(spring security)-这是我看过对springsecurity分析的最好的 最清晰的文章

在SpringSide 3的官方文档中,说安全框架使用的是Spring Security 2.0。乍一看,吓了我一跳,以为Acegi这么快就被淘汰了呢。上搜索引擎一搜,发现原来Spring Sec

2020腾讯云共同战“疫”,助力复工(优惠前所未有!4核8G,5M带宽 1684元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1054

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50018001未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

1,spring security

Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。

在安全框架这边使用最多的就是spring security。
论坛资料比较充实。

一个哥们写的例子,使用用的spring secuirty3开发的。
http://www.mkyong.com/spring-security/spring-security-remember-me-example/

spring security 相关内容:
http://www.mkyong.com/tutorials/spring-security-tutorials/

官方api:
http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity.html

首先根据demo下载源代码,解压缩导入工程。

代码很简单,4个jsp文件,一个controller。
数据库使用mysql,创建数据库和表:


CREATE TABLE users ( username VARCHAR(45) NOT NULL , password VARCHAR(45) NOT NULL , enabled TINYINT NOT NULL DEFAULT 1 , PRIMARY KEY (username));

CREATE TABLE user_roles ( user_role_id int(11) NOT NULL AUTO_INCREMENT, username varchar(45) NOT NULL, role varchar(45) NOT NULL, PRIMARY KEY (user_role_id), UNIQUE KEY uni_username_role (role,username), KEY fk_username_idx (username), CONSTRAINT fk_username FOREIGN KEY (username) REFERENCES users (username));

INSERT INTO users(username,password,enabled) VALUES ('mkyong','123456', true);
INSERT INTO users(username,password,enabled) VALUES ('alex','123456', true);

INSERT INTO user_roles (username, role) VALUES ('mkyong', 'ROLE_USER');
INSERT INTO user_roles (username, role) VALUES ('mkyong', 'ROLE_ADMIN');
INSERT INTO user_roles (username, role) VALUES ('alex', 'ROLE_USER');

CREATE TABLE persistent_logins ( username varchar(64) not null, series varchar(64) not null, token varchar(64) not null, last_used timestamp not null, PRIMARY KEY (series) );

其中persistent_logins 是记录用户remember me的。
使用token换用户名。
具体运行的效果,在那个demo里面已经介绍的非常清楚了。

使用remember me登陆之后会有一个cookie。

当退出之后就没了。
当没用权限的时候返回403。

推荐:Spring框架和Acegi安全框架介绍

1、spring   框架   Spring框架是由Open   Source开发的一个优秀的多层J2EE系统框架,它为企业级应用提供了一个非常轻量级的解决方案,大大地降低了应用开发的

配置authentication-manager

<authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password, enabled from users where username=?" authorities-by-username-query="select username, role from user_roles where username =? " />
        </authentication-provider>
    </authentication-manager>

首先配置了数据源,按用户名密码查询表users,查询再按照和用户名查询权限。返回权限列表。
当时remember me情况登陆的时候直接查询persistent_logins,用token换用户登陆名,在用户登录名查询用户信息,权限。

但是在做互联网应用的时候,一般用户就一个权限。根本没用role表,不用这么复杂。

3,自定义AuthenticationProvider

首先实现一个UserDetailsService。这里应该进行数据库查询。然后返回UserDetails。这里省略直接创建一个对象,密码写死,只要是登陆成功兜风返回ROLE_USER权限。

public class MyUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String userName)
            throws UsernameNotFoundException {
        ArrayList list = new ArrayList();
        list.add(new SimpleGrantedAuthority("ROLE_USER"));
        User details = new User("demo", "demo", list);
        return details;
    }
}

然后实现一个AuthenticationProvider

public class MyAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    UserDetailsService userDetailsService;

    public Authentication authenticate(Authentication authentication)
            throws AuthenticationException {
        //username
        System.out.println("user name: " + authentication.getName());
        //password
        System.out.println("password: " + authentication.getCredentials());
        System.out.println("getPrincipal: " + authentication.getPrincipal());
        System.out.println("getAuthorities: " + authentication.getAuthorities());
        System.out.println("getDetails: " + authentication.getDetails());
        UserDetails userDetails = (UserDetails) this.userDetailsService.loadUserByUsername(authentication.getName());

        if (userDetails != null && userDetails.getPassword() != null
                && !userDetails.getPassword().equals(authentication.getCredentials())) {
            //如果密码不相同直接抛出异常。
            throw new UserNamePasswordErrorException("用户名或密码错!");
        }

        //如果用户名密码正确。
        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(
                userDetails, authentication.getCredentials(), userDetails.getAuthorities());
        return result;
    }

    public boolean supports(Class authentication) {
        return true;
    }

    public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }
}

这里如果用户名密码错误,直接抛出一个自定义异常:

public class UserNamePasswordErrorException extends AuthenticationException {
    public UserNamePasswordErrorException(String msg) {
        super(msg);
    }
}

然后修改配置:

    <bean id="userDetailsService" class="com.demo.security.auth.MyUserDetailsService"/>
    <bean id="myAuthenticationProvider" class="com.demo.security.auth.MyAuthenticationProvider">
        <property name="userDetailsService" ref="userDetailsService"/>
    </bean>

<authentication-manager>
        <authentication-provider ref="myAuthenticationProvider">
        </authentication-provider>
    </authentication-manager>

4,总结

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50018001未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

spring security在安全上面只要配置下就好了,很方便。
但只是进行了初步的研究。比如加密问题,比如cookie改名字的问题,还需要继续研究。

推荐:Spring acegi 安全框架

 Spring ACEGI  作为Spring丰富生态系统中的一个非常典型的应用,安全框架Spring ACEGI的使用是非常普遍的。尽管它不属于Spring平台的范围,但由于它建立在Sprin

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50018001未经博主允许不得转载。 博主地址是:http://blog.csdn.net/freewebsys 1,spring security Spring Security 的前

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。