使用Spring Security框架实现登入权限控制.

使用Spring Security框架简单步骤
1.导入依赖

<!--        配置security-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>

2.配置XML文件
配置步骤:
1.放行静态资源.登入.退出.注册.提示页面.
2.设置登入页面资源.设置拦截规则和对应权限
3.设置退出页面属性.
4.配置登入密码加密解密
5.

<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>

c).<security:form-login />定义跳转的具体的页面

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:security="http://www.springframework.org/schema/security"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd">

	<!-- 配置不拦截的资源 -->
	<security:http pattern="/login.jsp" security="none"/>
	<security:http pattern="/failer.jsp" security="none"/>
	<security:http pattern="/css/**" security="none"/>
	<security:http pattern="/img/**" security="none"/>
	<security:http pattern="/plugins/**" security="none"/>



	<!--
        配置具体的规则
        auto-config="true"	不用自己编写登录的页面,框架提供默认登录页面
        use-expressions="false"	是否使用SPEL表达式(没学习过)
    -->
	<security:http auto-config="true" use-expressions="false" >
		<!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER,ROLE_ADMIN的角色" -->
		<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>

		<!-- 定义跳转的具体的页面 -->
		<security:form-login
				login-page="/login.jsp"
				login-processing-url="/login.do"
				default-target-url="/index.jsp"
				authentication-failure-url="/failer.jsp"
				authentication-success-forward-url="/pages/main.jsp"
		/>

		<!-- 关闭跨域请求 -->
		<security:csrf disabled="true"/>
		<!-- 退出 指定注销路径,自动完成用户注销-->
		<security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp" />

	</security:http>

	<!-- 切换成数据库中的用户名和密码 -->
	<security:authentication-manager>
		<security:authentication-provider user-service-ref="userServiceImpl">
			<!-- 配置解密的方式-->
            <security:password-encoder ref="passwordEncoder"/>
		</security:authentication-provider>
	</security:authentication-manager>

	<!-- 配置加密类 -->
	<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

	<!-- 提供了入门的方式,在内存中存入用户名和密码
    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="admin" password="{noop}admin" authorities="ROLE_USER"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
    -->

</beans>



3.创建用户接口 继承UserDetailsService,让实现类重写UserDetails的loadUserByUsername方法,实现用户加载验证.

public interface IUserService extends UserDetailsService {

    /**
     * 查询所有用户信息
     * @return
     */
   List<UserInfo> findAll(int PageNum,int PageSize);

    void save(UserInfo userInfo);

    UserInfo findById(String id);

    List<Role> findRoleByUserId(String id);

    void addRoleToUser(String userId, String[] roleIds);
}

@Component
public class UserServiceImpl implements IUserService {

    @Autowired
    IUserInfoDao userInfoDao;

//    加密对象
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //根据用户名查询数据库
        UserInfo userInfo = userInfoDao.findByUser(username);

        //加载角色信息
        List<SimpleGrantedAuthority> list=new ArrayList<>();
        //遍历角色的权限
        for (Role role : userInfo.getRoles()) {
            SimpleGrantedAuthority sga = new SimpleGrantedAuthority(role.getRoleName());
            list.add(sga);
        }

        User user = new User(userInfo.getUsername(),userInfo.getPassword(),list);

        return user;
    }

    @Override
    public void save(UserInfo userInfo) {
        //对密码进行加密
        userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
        System.out.println("加密用户:"+userInfo.toString());
        userInfoDao.save(userInfo);
    }

4.userInfoDao Bean

public interface UserInfoDao {

    @Select("select * from users where username=#{username}")
   UserInfo findByUser(String username);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值